Tôi có một abstract class A
tuyên bố một phương pháp trừu tượng doStuff
. Hiện tại có nhiều lớp kế thừa từ A
và thực hiện doStuff
.
Các thể hiện của lớp được khởi tạo vào thời gian chạy thông qua AFactory
dựa trên đầu vào của người dùng. Ban đầu tất cả các lớp có cùng một tham số (đầu vào của người dùng). Nhưng bây giờ tôi có một tham số bổ sung mà chỉ một lớp mới kế thừa A
nhu cầu.
Vì vậy, phá vỡ nó mặc dù logic sau:
Lớp trình thông dịch tạo các thể hiện dựa trên đầu vào của người dùng (
AFactory
dĩ nhiên là sử dụng ) không biết về tham số phụ này.- Cố gắng đẩy nó vào lớp phiên dịch lớp sẽ thực sự khó xử vì sau đó tôi sẽ phải biết khi nào nên chuyển nó đến nhà máy, nơi đánh bại toàn bộ mục đích của việc có một nhà máy ngay từ đầu.
- Gửi nó một cách mù quáng vào Nhà máy với hy vọng nó có thể làm điều gì đó với nó có vẻ khá xấu xí.
Giải pháp hiện tại của tôi: Trong khi đó tôi đã quyết định tái cấu trúc
A.doStuff(Param param)
thànhA.doStuff(AParams params)
.AParams
có thể giữ những gì từng tham số cần thiết vàdoStuff
có thể bỏ qua sau đó nếu họ không quan tâm đến chúng. Điều này cũng có vẻ hơi khó xử với tôi và nhắc nhở tôi về việc gửi các cấu trúc trong WIN32API có thể chứa nhiều tham số vô dụng xấu xí và tôi không thích nó.
Có cách nào thanh lịch hơn để tiếp cận vấn đề này? Hoặc một số mẫu thiết kế mà tôi đã bỏ qua và giải quyết điều này?
Ghi chú :
- Chúng tôi đang sử dụng Java 1.7
- Tên của lớp là ngớ ngẩn để nhấn mạnh vấn đề thiết kế lý thuyết mà họ có tên chỉ định, có ý nghĩa bình thường trong thực tế :)
- Tôi đã tìm kiếm khá nhiều nhưng nhận ra rằng khá khó để tìm kiếm trên web các vấn đề lý thuyết trừu tượng cụ thể (trái ngược với lý do tại sao lại
X
némException
mã này) Tôi đã quyết định hỏi vì vậy tôi xin lỗi nếu đây là một bản sao.
Chỉnh sửa 1 :
- Làm rõ: Tôi cần truyền một đối số cụ thể của lớp con cho
doStuff
phương thức.
EDIT 2 :
Tôi không hoàn toàn hiểu ý định của Kilian Foth vì vậy tôi đã viết một số mã giả Java để giúp tôi giải thích rõ hơn vấn đề / hiểu giải pháp của bạn. Vì thế:
Đây là một bộ xương của vấn đề của tôi.
Đây là một bộ xương của giải pháp của tôi.
Đây là những gì tôi nghĩ có thể là giải pháp của Kilian Foth, nhưng tôi không chắc.
EntryPoint
gọi main
mà sau đó gọi một số Interpreter
mà hiện tại không nhận được thông số phụ như là một tham số và nhà máy cũng vậy. Thông số bổ sung đến từ một loại đầu vào người dùng khác không được mô tả bởi UserInput
(rất tiếc là tôi không thể thay đổi).
doStuff
phương thức đó?