2011-07-19 33 views
5

Tình hình là tôi muốn kế thừa một đối tượng để có một giao diện constructor sạch:Thừa hưởng một lớp học với đối số nhà xây dựng trong java

class BaseClass { 
    public BaseClass(SomeObject object){ 
     ... 
    } 
} 

class SubClass extends BaseClass{ 
    private SubObject subObject = new SubObject(); 
    public SubClass(){ 
     super(new SomeObject(subObject)); // doesn't compile 
    } 
} 

Tuy nhiên, để làm được điều đó tôi cần phải làm những thứ trước khi các nhà xây dựng như trong ví dụ ở trên nhưng không thể vì Java không cho phép điều đó. Có cách nào để khắc phục điều này? Tôi bắt đầu cảm thấy rằng nếu lớp của bạn được thiết kế để được phân lớp, nó luôn luôn triển khai hàm tạo mặc định và cung cấp các giá trị cho các giá trị cần thiết ... Đôi khi bạn có thể loại bỏ điều này nếu bạn tạo một đối tượng mới thẳng vào siêu constructor như một đối số nhưng nếu bạn cần một tham chiếu đến đối tượng mà bạn đã tạo thì bạn sẽ được ẩn.

+1

Lỗi biên dịch bạn nhận được là gì? –

+0

không thể tham chiếu subObject trước khi supertype constructor được gọi là – palto

+0

* Không thể tham chiếu đến trường con subObject trong khi gọi một constructor rõ ràng * –

Trả lời

4

Bạn cần thay đổi để bạn không đề cập đến một thành viên cá thể trong cuộc gọi superconstructor. Thật không may nếu bạn cần phải "tiết kiệm" SubObject, nó trở nên phức tạp. Tôi nghĩ bạn phải làm điều đó với chuỗi hàm dựng:

class SubClass extends BaseClass{ 
    private SubObject subObject; 

    public SubClass() { 
     this(new SubObject()); 
    } 

    private SubClass(SubObject subObject) { 
     super(new SomeObject(subObject)); 
     this.subObject = subObject; 
    } 
} 
0
public SubClass(){ 
    super(new SomeObject(new SubObject())); // this should compile 
} 

Bây giờ trong lớp siêu của bạn, làm một cái gì đó như thế này:

private final SomeObject foo; 
public BaseClass(SomeObject foo){ 
    this.foo = foo; 
} 
public /* or protected */ SomeObject getFoo(){return this.foo;} 
+0

Bạn không thể tham chiếu SubObject theo cách đó – palto

+1

'super' nhận' SomeObject' làm tham số không phải 'SubObject' –

+0

Đúng vậy, nhưng bạn có thể lấy nó từ siêu lớp thông qua một người truy cập, xem cập nhật của tôi –

0

Không chính xác một câu trả lời vì bạn sẽ không có SubClass, nhưng bạn có thể sử dụng một nhà máy.

public BaseClassFactory { 
    public static BaseClass newBaseClass() { 
     // init some object 
     // ... 
     return new BaseClass(someObject); 
    } 
} 
Các vấn đề liên quan