2012-02-23 6 views
15

Tôi có một lớp A, với một phương pháp doAction trừu tượng (BaseClass obj) mong đợi một param loại BaseClassĐi qua lớp Derived đến một phương pháp mà cần phải ghi đè mong đợi một lớp cơ sở

public class A { 
    //.... 
    abstract void doAction(BaseClass obj); 
    //.... 
} 

Bây giờ, tôi có một lớp B cần mở rộng A. Tuy nhiên, phương thức doAction của B cần sử dụng đối tượng DerivedClass mở rộng BaseClass.

public class B extends class A { 
    //.. 
    void doAction(DerivedClass obj) { 
      obj.callMethodAvailableOnlyInDerivedClass(); 
     } 

} 

Làm thế nào để xử lý tình trạng này mà tôi cần phải vượt qua param loại DerivedClass phương pháp để được ghi đè trong khi nó đang mong đợi một BaseClass?

Cảm ơn!

Trả lời

20

Bạn làm cho lớp cơ sở chung:

public class A<T extends BaseClass> { 
    //.... 
    abstract void doAction(T obj); 
    //.... 
} 

và lớp con tham số với các lớp có nguồn gốc:

public class B extends A<DerivedClass> { 
    //.. 
    void doAction(DerivedClass obj) { 
     obj.callMethodAvailableOnlyInDerivedClass(); 
    } 
} 

Nếu không có Generics, nó không phải có thể bởi vì B sẽ phá vỡ hợp đồng của A: A chấp nhận bất kỳ loại BaseClass nào, nhưng bạn đã hạn chế B chỉ chấp nhận một lớp con cụ thể. Điều này không tôn trọng Liskov principle.

+0

+1 cho nguyên tắc Liskov. Lần đầu tiên tôi nghe về nó, cảm ơn! – GETah

+1

Và nếu bạn có một loạt các phương pháp này hành động trên các đối tượng khác nhau ?! –

4

Bạn có thể sử dụng:

public abstract class A<T extends BaseClass> { 
//.... 
abstract void doAction(T obj); 
//.... 
} 


public class B extends class A<DerivedClass> { 
//.. 
void doAction(DerivedClass obj) { 
     obj.callMethodAvailableOnlyInDerivedClass(); 
    } 

} 
1

Không có thông số Contra-Variance trong java vì nó không an toàn.

Giả sử bạn có A a = new B();

Và sau đó bạn gọi a.doAction(new BaseClass()) Điều gì sẽ xảy ra?

Điều này sẽ gây ra lỗi thời gian chạy, vì B không biết "cần làm gì" với BaseClass. java muốn tránh nó - vì vậy không có hiệp phương sai của các tham số.