2011-09-07 41 views
5

Methods Overriding trong java có các tính năng sau:Overriding phương pháp hạn chế trong java

1> Phương pháp Overrinding nên có danh sách đối số tương tự như phương pháp lớp phụ huynh.

2> Kiểu trả về phải giống nhau/phân lớp của kiểu trả về cho phương thức lớp cha.

3> Cấp truy cập phải giống hoặc ít hạn chế như phương pháp lớp cha mẹ.

4> Phương pháp ghi đè có thể ném cùng một ngoại lệ hoặc hẹp hơn và không phải là một ngoại lệ rộng hơn.

* Chỉ cần muốn biết tại sao nó lại như vậy cho điểm *

* 2 - tại sao lớp con tại sao không phải là một lớp cha? *

3 - lý do mức truy cập nên ít hạn chế hơn?

4 - tại sao nó nên ném ngoại lệ hẹp?

Theo sự hiểu biết của tôi nó chỉ là nếu tôi đang tạo ra một refrence tầng lớp phụ huynh để tạo ra một đối tượng lớp trẻ và cố gắng chạy xuống mỗi kịch bản sau đó

Cho phép giả định A là lớp chaB là lớp con cả có phương pháp printAndReturnSomething()

public class A{ 

     public B printAndReturnSomething(){ 
       S.O.P("Inside A Print"); 
       return new B(); 
       } 
} 

Bây giờ chúng tôi có các lớp con B như

public class B extends A{ 
     public A printAndReturnSomething(){ // I know this isn't possible to return A but had it been then 
       S.O.P("Inside A Print"); 
       return new A(); 
       } 
} 

Bây giờ nếu tôi làm điều gì đó như thế này

A a =new B(); 

và bây giờ như tôi có một tham chiếu của A vì vậy tôi hy vọng các kiểu trả về là kiểu B

B returnedValue=a.printAndReturnSomething(); // But it actually calls the child class method and hence returns A. So here comes the contradiction. 

Similaraly cho kịch bản 3 và 4. Sự hiểu biết của tôi có đúng không? Tôi có thiếu cái gì khác có liên quan hơn không?

Trả lời

5

Tất cả điều này có thể được tóm tắt bằng cách nói rằng "một phân lớp phải hoạt động như thể nó là một siêu lớp". Vì vậy, nếu Derived mở rộng Base và tôi có một đối tượng x loại Derived, thì tôi muốn nó hoạt động chính xác như thể loại Base.

Vì vậy, nếu x.foo() lợi nhuận một số loại T, và Base::foo() lợi nhuận một loại S, sau đó tôi muốn để có thể đối xử với x.foo() như một S, vì vậy tốt hơn T được giống như hoặc một lớp con của S.

Tương tự, x.foo() chỉ nên ném ngoại lệ mà Base:foo() hứa hẹn. Nó không thể bắt đầu ném những ngoại lệ mới, bất ngờ.

Nếu Base::foo() là công khai, thì phải là x.foo(). Bạn không thể đột nhiên có một hạn chế chặt chẽ hơn trên lớp dẫn xuất, bởi vì lớp cơ sở đã hứa với tôi rằng nó là công khai.

Luôn nghĩ rằng thừa kế là "hoạt động giống như lớp siêu" hoặc "có thể được coi như lớp cha" và tất cả điều này phải rõ ràng.

+0

Cảm ơn bạn đã ans và đặc biệt là dòng cuối cùng "Luôn nghĩ về thừa kế là" hoạt động như lớp siêu ", hoặc" có thể được đối xử như siêu lớp ", và tất cả điều này phải rõ ràng." – Deva

3

Point # 2

Hãy tưởng tượng như sau:

class Animal {} 
class Dog extends Animal {} 

class Base { 
    Dog get() { ... } 
} 

class Derived extends Base { 
    Animal get() { ... } 
} 

Base b = new Derived(); 
Dog d = b.get(); // What? 

luận tương tự có thể được áp dụng cho những câu hỏi khác.

+0

Cảm ơn phản hồi của bạn. Điều này tôi đã đề cập trong câu hỏi. những gì tôi muốn kiểm tra là lý do duy nhất này? – Deva

+2

@Deva: Đây là một lý do khá cơ bản!Nó đơn giản sẽ không có ý nghĩa gì cả. –

+0

Yup Cảm ơn Oli .. – Deva

1

Để trả lời điểm của bạn:

2 - tại sao lớp con tại sao không phải là một lớp cha?

Nếu một lớp cha được phép, điều này có thể xảy ra:

class A { 
    public A makeCopy() { return clone(); } 
} 

class B extends A { 
    public Object makeCopy() { return new Date(); } 
} 

public static void main(String[] args) { 
    A a = new B(); 
    A copy = a.makeCopy(); // OOPS -- didn't get an A after all! 
} 

3 - tại sao các cấp độ truy cập nên ít hạn chế?

Sửa đổi các lớp B ở trên để:

class B extends A { 
    private A makeCopy() { return clone(); } 
} 

public static void main(String[] args) { 
    A a = new B(); 
    A copy = a.makeCopy(); // OOPS -- accessing a private method! 
} 

4 - tại sao nó nên ném ngoại lệ hẹp?

Cùng ý tưởng - nếu A.makeCopy được tuyên bố để ném một AException (một lớp ngoại lệ giả khai báo trong A), nhưng B.makeCopy được tuyên bố để ném Throwable, sau đó B.makeCopy có thể ném bất cứ thứ gì. Điều đó sẽ làm cho nó không thể hợp lý mã một khối try/catch trong main.

4

Theo sự hiểu biết của tôi nó chỉ là nếu tôi đang tạo ra một refrence tầng lớp phụ huynh để tạo ra một đối tượng lớp trẻ và cố gắng chạy xuống mỗi kịch bản ...

Tôi nghĩ rằng bạn groked ý tưởng chính xác.

Case với parent class tham khảo lớp đối tượng là nơi cái gọi là Liskov substitution principle đi vào chơi: trong một chương trình máy tính nếu S là một subtype của T, sau đó đối tượng của loại T [đó là "tầng lớp phụ huynh" của bạn] có thể được thay thế bằng các đối tượng kiểu S [đó là "đối tượng lớp con"] (nghĩa là đối tượng thuộc loại S có thể thay thế cho các đối tượng kiểu T), mà không thay đổi bất kỳ thuộc tính mong muốn nào của chương trình đó đã thực hiện, v.v.) ...

+1

+1 để đề cập đến nguyên lý thay thế Liskov – Andrey

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