2010-06-26 36 views
6

Tôi đang gặp một vấn đề về khái niệm ở đây tôi có như thế này:quá tải kế thừa phương pháp trừu tượng

abstract class A 
{ abstract setSomething(bool f1, bool f2);} 

class C : A {setSomethng(bool f1, bool f2){/*implementation*/}} 

class B : A {setSomething(bool f1, bool f2, bool f3){/*implementation*/} !! ERROR 

Tôi đang cố gắng để thay đổi chữ ký của phương pháp "setSomething" trong lớp con "B" nhưng nó cung cấp cho tôi một lỗi rằng subClass B không thực hiện lớp trừu tượng cơ sở, có anyway để làm điều này? Tôi có nghĩa là để quá tải một phương pháp trừu tượng kế thừa?

+2

Nó không phải do lỗi đánh máy? 'setSomethng' và' setSomething' –

+2

Ngoài ra, không có subClass D trong ví dụ của bạn. –

+0

Xin lỗi tôi đã chỉnh sửa rằng đó là B chứ không phải D. – Lisa

Trả lời

13

Khi bạn kế thừa từ một lớp trừu tượng bạn có cần phải cung cấp triển khai cho tất cả các phương pháp trừu tượng, hoặc nếu không bạn phải khai báo lớp con cũng là abstract. Bạn được phép thêm các phương thức mới, nhưng bạn không thể xóa hoặc thay đổi các phương thức hiện có.

Với điều này trong tâm trí bạn có thể cung cấp hai quá tải của phương pháp này, người ta có và một không boolean thêm:

class B : A 
{ 
    void setSomething(bool f1, bool f2){ /* implementation */ } 
    void setSomething(bool f1, bool f2, bool f3){ /* implementation */ } 
} 

Bạn thậm chí có thể muốn xem xét việc thực hiện một trong các điều khoản của bên kia:

void setSomething(bool f1, bool f2) { setSomething(f1, f2, false); } 
void setSomething(bool f1, bool f2, bool f3) { /* implementation */ } 

Nếu bạn không muốn hai phiên bản tham số ở đó thì có thể bạn nên xem xét lại nếu thích hợp để sử dụng lớp A làm lớp cơ sở.

7

Phương pháp được xác định theo tên và chữ ký. Do đó, để đáp ứng việc triển khai phương pháp trừu tượng, bạn cần triển khai phương thức này với chữ ký này (setSomething(bool f1, bool f2)).

Cho dù bạn thêm quá tải không quan trọng, vì quá tải sẽ là phương pháp mới và không ghi đè lên phương pháp khác. Tất nhiên phương pháp trừu tượng ghi đè có thể gọi phương thức quá tải để tránh sự trùng lặp thực hiện, như vậy:

class B : A { 
    override setSomething(bool f1, bool f2) { 
    setSomething(f1, f2, false); // use the default value you want to use for f3 
    } 

    setSomething(bool f1, bool f2, bool f3) { 
    /*implementation*/ 
    } 
} 
2

Bạn có thể quá tải phương thức trừu tượng được kế thừa, nhưng bạn vẫn phải phải triển khai phương pháp trừu tượng.

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