2012-04-02 41 views
5

Về cơ bản, tôi có:java lớp con: nhiều nhà xây dựng được kế thừa từ lớp cha trừu tượng

public abstract class AbstractClass { 
    public AbstractClass(Type arg0, Type arg1, Type arg2) { 
     // do some stuff with all those args 
    } 

    public AbstractClass(Type onlyOneArg) { 
     // do different stuffs with this different arg. 
    } 

    protected someMethods() { /* ... */ } 
} 

Và tôi có một vài vấn đề trong các lớp con:

  • Trước tiên, tôi phải -trong hầu hết các case- uselessly viết lại các hàm tạo. Không phải là rất khó chịu, chỉ cần một chút bẩn để mắt.
  • Và, quan trọng hơn, tôi không bị buộc phải triển khai cả hai nhà xây dựng (mặc dù cả hai đều được sử dụng trong chương trình).

Ví dụ về các lớp con hiện tại của tôi:

public class MyClass extends AbstractClass { 
    public MyClass(Type arg0, Type arg1, Type arg2) { 
     super(arg0, arg1, arg2); 
    } 

    public MyClass(Type onlyOneArg) { 
     super(onlyOneArg); 
    } 
} 

  • Tôi có để có thể viết một số mã đặc biệt trong constructor của lớp con nếu tôi muốn.
  • Tôi có quá nhiều mã được chia sẻ mà tôi muốn giữ trong lớp trừu tượng.

Tôi có thể làm gì đó không? Có điều gì tôi không biết về Java không? Hay thiết kế của tôi có xấu không? Hoặc là.. ?

+1

Không chắc chắn câu hỏi là gì. Bạn có muốn bị buộc phải thực hiện tất cả các nhà xây dựng siêu lớp? Nó là gì về các yêu cầu bạn đã nói rằng bạn dường như không thể làm gì? –

+0

Tôi sẽ rất vui khi cải thiện câu hỏi nhưng tôi không chắc chắn như thế nào .. Tôi có nghĩa là tôi muốn chắc chắn rằng trong mỗi lớp con 'AbstractClass', cả hai nhà xây dựng đều có sẵn. Trong chương trình, tôi đang instantiating với cả hai nhà xây dựng mà không biết chính xác loại.Tôi chỉ biết rằng đối tượng sẽ là một lớp con 'AbstractClass'. Vì vậy, tôi phải chắc chắn rằng tôi luôn có thể sử dụng cả hai nhà xây dựng. Điều đó có dễ hiểu hơn không? ... Sry, khó thể hiện suy nghĩ của tôi bằng tiếng Anh! – user978548

+0

Bên cạnh đó, tôi cũng băn khoăn liệu có thể nào java có thể tự động sử dụng constructor 'AbstractClass' nếu nó không được định nghĩa trong phân lớp, nhưng đó không phải là mối quan tâm chính của tôi. – user978548

Trả lời

1

Lớp con phải gọi hoặc một (hoặc cả hai, nếu bạn xác định lại cả hai như trong ví dụ) của các nhà xây dựng siêu lớp; nhưng bạn không thể ép buộc nó định nghĩa lại các nhà xây dựng với cùng chữ ký của lớp cha.

Cách duy nhất để đảm bảo rằng một constructor lớp cha là gọi là phải có chỉ có một constructor trong lớp cha.

Tôi nghĩ bạn nên nghĩ ra một cách để thiết kế lại lớp cha của bạn (có thể tạo 2 lớp) để chỉ có một hàm tạo nếu bạn muốn nó luôn gọi là.

Nhưng, nếu muốn có một hàm tạo cụ thể có mặt trong một phân lớp, bạn nên tách biệt mối quan tâm "xây dựng" trong một nhà máy; nơi bạn có thể có các lớp nhà máy đặc biệt cho từng lớp con của bạn. Nhà máy của bạn sẽ triển khai giao diện này:

interface AbstractClassFactory { 
    AbstractClass create(Type arg0, Type arg1, Type arg2); 
    AbstractClass create(Type onlyOneArg); 
} 
+0

Chỉ cần một chút câu hỏi liên quan: Tôi vừa thử nghiệm trong Eclipse và thấy rằng tôi có thể đặt giao diện nhà máy được lồng trong lớp trừu tượng, và mỗi nhà máy phân lớp lồng nhau như lớp lồng nhau trong lớp tương ứng của chúng mà không có vấn đề gì. Đó có phải là thực tiễn không tốt? – user978548

+0

@ user978548: Không nhất thiết, nó có thể gây nhầm lẫn cho người dùng của bạn. Ngoài ra, giao diện và các lớp nhà máy lồng nhau của bạn nên là ['static'] (http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html). –

0

Constructors không được kế thừa trong Java. Đôi khi điều đó có thể gây phiền nhiễu, nhưng nó giống như vậy. Tôi không hiểu, tại sao bạn muốn mọi phân lớp thực thi cả hai hàm tạo. Bạn viết "Trong chương trình, tôi đang instantiating với cả hai nhà xây dựng mà không biết chính xác loại". Ý bạn là như thế nào? Bạn không thể khởi tạo một lớp trừu tượng, bạn cần biết loại bê tông nào bạn đã khởi tạo bằng "mới". Nếu bạn sử dụng sự phản chiếu, bạn có thể kiểm tra các nhà xây dựng có sẵn trên thời gian chạy.

+0

Tôi đang sử dụng sự phản chiếu, nhưng nhu cầu về các hàm tạo khác nhau có liên quan đến việc sử dụng của người dùng cuối. Nhưng tôi sẽ sử dụng nhà máy thay vì các nhà thầu. – user978548

Các vấn đề liên quan