Cần giúp đỡ bài tập về các phương thức của class điện thoại

Ai giải bài này giúp em với. em đọc mà không hiểu phải làm như thế nào ?

Điện thoại di động được chia thành 2 loại: điện thoại cổ điển và điện thoại thông minh. Cả 2 loại điện thoại này đều có 4 chức năng cơ bản: nghe và gọi điện thoại, gửi và nhận tin nhắn văn bản. Riêng điện thoại thông minh thì có thêm các chức năng: sử dụng 3G, chụp hình. Điện thoại cổ điển có sẵn chức năng nghe đài radio (điện thoại thông minh không có sẵn chức năng này). Cả điện thoại cổ điển và điện thoại thông minh đều có thể sử dụng làm vũ khí
(trong tình huống người dùng cần sử dụng để tấn công kẻ xấu).
Sinh viên hãy thiết kế các lớp và phương thức theo lập trình hướng đối tượng bằng ngôn ngữ lập trình Java cho bài toán trên. Yêu cầu cụ thể như sau:

  • Nếu sinh viên thiết kế đúng quan hệ kế thừa giữa các lớp thì được 0.5 điểm.
  • Nếu sinh viên biết tạo các hàm trừu tượng và override được các hàm này thì được 0.5 điểm.
  • Nếu sinh viên biết tạo các phương thức đặc thù riêng cho mỗi class thì được 0.5 điểm.
  • Nếu sinh viên biết tạo được interface và cho các lớp implement interface này đúng cách thì được 0.5 điểm.
    Lưu ý: Khi tạo các phương thức, sinh viên chỉ cần mô tả tên phương thức, kiểu trả về, danh sách tham số đầu vào, không cần viết mã cho nội dung phương thức. Ví dụ phương thức goiDienThoai chỉ cần thiết kế như sau trong file java:
 void  goiDienThoai(String soDienThoaiCanGoi) { 
                       //TODO 
           }

Quá cơ bản.
Bạn đang “NHỜ” giải hộ à?
Bạn nên tự làm, đến đâu chưa làm được thì hỏi.

1 Like

em xác định ko đc .kiểu đọc đề thấy mô hồ sao ý .

Điện thoại:

  • nghe
  • gọi
  • gửi
  • nhận

Điện thoại cổ điển:

  • Nghe radio

Chức năng Vũ khí:

  • Đánh

Viết class và/hoặc viết interface để thể hiện như vậy. Không có đáp án duy nhất.

4 Likes


như vậy được không anh

interface VuKhi:
void tanCong(String keXau);
abstract class DienThoaiDiDong implements VuKhi
void nghe();
void goi(String num);
void nhanTin();
void guiTin(String num);
class DienThoaiCoDien extends DienThoaiDiDong
@Override void tanCong(String keXau);
void ngheRadio();
class DienThoaiThongMinh extends DienThoaiDiDong
@Override void tanCong(String keXau);
void suDung3G(bool enabled);
void chupHinh();

@Override void nghe()
{
    this.super();
    ...
}
@Override void goi(String num);
@Override void nhanTin();
@Override void guiTin(String num);

Vũ khí implement Điện thoại di động thấy sai sai, chả nhẽ mọi vũ khí đều có thể gọi điện được? Đề chỉ yêu cầu mọi điện thoại đều tấn công được thôi.

4 Likes

Tôi đồng ý với cách giải của bạn @noz1995. Tuy nhiên, theo tôi thấy cách tốt nhất vẫn là giúp cho bạn @john_best hiểu vấn đề thay vì đưa ra lời giải cụ thể. Chúng ta thử phân tích tại sao lời giải của bạn @noz1995 là đúng:

Bước 1: Theo đề bài, dễ thấy chúng ta có ít nhất 2 lớp đối tượng (class): Điện thoại thông minhĐiện thoại cổ điển. Lý do chúng ta xếp chúng là những đối tượng là vì chúng đều có những đặc tính (property) riêng. Cụ thể như sau:

Điện thoại thông minh:

  • Nghe

  • Gọi

  • Gửi tin nhắn

  • Nhận tin nhắn

  • Sử dụng 3G

  • Chụp hình

  • Dùng làm vũ khí

Điện thoại cổ điển:

  • Nghe

  • Gọi

  • Gửi tin nhắn

  • Nhận tin nhắn

  • Nghe radio

  • Dùng làm vũ khí

Bước 2: Từ phân tích trên, chúng ta thấy 2 lớp này có chung các đặc điểm sau đây:

  • Nghe

  • Gọi

  • Gửi tin nhắn

  • Nhận tin nhắn

  • Dùng làm vũ khí

Như vậy, theo bản chất của hướng đổi tượng (OOP), chúng ta có thể sử dụng tính kế thừa (inheritance) và đưa các đặc điểm chung này vào một lớp cha (supper class). Và vừa đúng lúc đề bài cũng cho biết rằng Điện thoại thông minhĐiện thoại cổ điển được thừa hưởng những đặc điểm trên từ Điện thoại di động. Như vậy, dễ thấy rằng có thêm một lớp nữa là lớp Điện thoại di động với 5 đặc điểm trên, và lớp này là lớp cha của hai lớp con Điện thoại thông minh và Điện thoại cổ điển. Từ đó, chúng ta có mô hình thừa kế như sau:

image

Đến đây thì xem như chúng ta đã hoàn thành phân tích một cách tổng quát.

Để kiểm tra xem cách thiết kế các lớp của chúng ta có đúng hay không, chúng ta có thể dùng cách đơn giản như sau:

Quan hệ giữa lớp cha và lớp con là is-a, nghĩa là một lớp con sẽ có thể được định nghĩa từ lớp cha. Cụ thể hơn, chúng ta thử xem 2 mệnh đề sau đây có đúng không:

  • Điện thoại thông minh là (is-a) điện thoại di động

  • Điện thoại cổ điển là (is-a) điện thoại di động

Dễ thấy rằng 2 mệnh đề này đều đúng. Như vậy thiết kế cây kế thừa của chúng ta là chính xác (Lưu ý chiều ngược lại không đúng, chúng ta không thể kết luận điện thoại di động là điện thoại thông minh hay điện thoại cổ điển).

Xem có vẻ hoàn hảo, phải không? Tuy nhiên, nếu đi sâu hơn, chúng ta sẽ thấy một số vấn đề sau:

  • Cách thức nghe, gọi, gởi và nhận tin nhắn có thể được thực hiện khác nhau trên điện thoại thông minh và điện thoại cổ điển dù rằng chúng đều có các tính năng này
  • “Làm vũ khí” không phải là một tính năng cơ bản của điện thoại (trừ điện thoại của 007 - James Bond), như vậy thì chọn “làm vũ khí” là một đặc tính của điện thoại di động là không ổn.

Từ đó, chúng ta tiếp tục cải tiến thiết kế trong các bước tiếp theo.

Bước 3: Để đáp ứng điều kiện là cách thực hiện nghe, gọi, gởi và nhận tin nhắn có thể được thực hiện một cách khác nhau trong 2 lớp con Điện thoại thông minhĐiện thoại cổ điển, chúng ta thay đổi Điện thoại di động thành lớp trừu tượng (abstract), đồng thời mô tả các đặc tính (chính xác hơn là các phương thức - hay method) nghe, gọi, nhận và gởi tin nhắn như là các abstract methods. Điều này cho phép các lớp con tự do đặc tả cách xây dựng (implement) các phương thức này.

Bước 4: Cuối cùng, để giải quyết vấn đề của đặc tính “làm vũ khí”, chúng ta thay đổi nó trở thành một giao diện (interface). Điều này có thể được hiểu như sau: Điện thoại di động (trong phạm vi của bài tập này) có thêm (has-a) tính năng dùng làm vũ khí. Như vậy, vũ khí là một interface của Điện thoại di động. Interface này sẽ cho phép người dùng tấn công kẻ xấu. Nói cách khác, tấn công kẻ xấu là phương thức (method) mà điện thoại di động có thêm khi xây dựng (implement) interface này.

Dựa trên hai bước 3 & 4, chúng ta có mô hình cuối cùng như sau:

Và cách đặc tả bằng Java theo như hướng dẫn của bạn @noz1995

Có một số cách giải quyết khác, nhưng cách phân tích này tương đối phù hợp với yêu cầu của bài.

Chúc vui,

6 Likes
module Abstract
  # magic
end

module W
  include Abstract
  must_implement :hit, :someone
end

module MobilePhone
  include Abstract
  must_implement :receive_call
  must_implement :call, :number
  must_implement :receive_sms
  must_implement :send_sms, :number
end

class FeaturePhone < MobilePhone
  include W
  def radio; end
end

class SmartPhone < MobilePhone
  include W
  def switch_to_3g; end
  def take_photo; end
end
FeaturePhone < W
> true
W > SmartPhone
> true
MobilePhone > FeaturePhone
> true
SmartPhone < MobilePhone
> true
MobilePhone.new
> undefined method 'new' for MobilePhone:Module (NoMethodError)

begin
  SmartPhone.new.call('867-5309')
rescue NoMethodError => e
  p e.message
end
> 'SmartPhone must implement #call from MobilePhone'
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?