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
và Đ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
và Đ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:

Đế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:
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
và Đ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,