2012-11-27 47 views
5

Tôi có một lược đồ thừa kế như dưới đây:một lớp trừu tượng được thừa hưởng một vấn đề khác lớp trừu tượng

public abstract class BaseAttachment 
{ 
    public abstract string GetName(); 
} 

public abstract class BaseFileAttachment:BaseAttachment 
{ 
    public abstract string GetName(); 
} 

public class ExchangeFileAttachment:BaseFileAttachment 
{ 
    string name; 
    public override string GetName() 
    { 
     return name; 
    } 
} 

tôi về cơ bản muốn gọi phương thức getName() của lớp ExchangeFileAttachment; Tuy nhiên, tuyên bố trên là sai. Bất kỳ trợ giúp nào với điều này đều được đánh giá cao. Cảm ơn

+1

Mục đích của bạn là cung cấp phương thức 'GetName' hoàn toàn mới trên' BaseFileAttachment' mà _hides_ 'BaseAttachment.GetName'? Nếu không, chỉ cần bỏ qua các redeclaration. –

+0

Tại sao 'ExchangeFileAttachment' được khai báo là' abstract'? –

+2

"Tuy nhiên, tuyên bố ở trên là sai" Bạn nên thực sự cung cấp thêm chi tiết trong câu hỏi của bạn. Nó không biên dịch? Nó không làm những gì bạn mong muốn? Nếu vậy, các lỗi hoặc hành vi không mong muốn là gì? – Servy

Trả lời

19

Hai vấn đề ngay lập tức tôi thấy là thức ExchangeFileAttachment lớp học của bạn được khai báo abstract, vì vậy bạn sẽ không bao giờ có thể nhanh chóng nó. Trừ khi bạn có một mức độ thừa kế khác mà bạn không cho chúng ta thấy, hãy gọi nó là không thể - không có cách nào để truy cập nó. Vấn đề khác là BaseFileAttachment có thuộc tính đang ẩn GetName() trong BaseAttachment. Trong cấu trúc bạn đang hiển thị cho chúng tôi, nó là thừa và có thể được bỏ qua. Vì vậy, các mã 'điều chỉnh' sẽ trông giống như:

public abstract class BaseAttachment 
{ 
    public abstract string GetName(); 
} 

public abstract class BaseFileAttachment : BaseAttachment 
{ 
} 

public class ExchangeFileAttachment : BaseFileAttachment 
{ 
    string name; 
    public override string GetName() 
    { 
     return name; 
    } 
} 

Tôi đặt sửa chữa trong dấu ngoặc kép vì use-case này vẫn không thực hiện một tấn tinh thần vì vậy tôi hy vọng bạn có thể cho biết thêm thông tin, hoặc đây có ý nghĩa hơn về kết thúc của bạn.

+0

Ví dụ mã này đã giúp tôi trả lời một câu hỏi hoàn toàn khác! –

11

Chỉ cần loại bỏ các khai báo lại từ BaseFileAttachment:

public abstract class BaseFileAttachment : BaseAttachment 
{ 
} 

BaseFileAttachment đã được thừa hưởng những GetName khai trừu tượng từ BaseAttachment. Nếu bạn thực sự muốn đề cập đến nó một lần nữa trong BaseFileAttachment, sử dụng override keyword:

public abstract class BaseFileAttachment : BaseAttachment 
{ 
    public override abstract string GetName(); // that's fine as well 
} 
+0

tác phẩm này! thanks – stoney78us

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