2009-11-20 44 views
5
public abstract class A 
{ 
    public abstract void Process(); 
} 

public abstract class B : A 
{ 
    public abstract override void Process(); 
} 

public class C : B 
{ 
    public override void Process() 
    { 
     Console.WriteLine("abc"); 
    } 
} 

Mã này ném lỗi biên dịch: 'B' không triển khai thành phần trừu tượng kế thừa 'A.Process()'.Phương pháp trừu tượng ghi đè phương pháp trừu tượng

Có cách nào để thực hiện việc này không?

+0

Tại sao bạn muốn? –

+0

Chính xác thì bạn đang cố gắng làm gì? Mã của bạn không có ý nghĩa nhiều ... –

Trả lời

13

Chỉ cần bỏ qua phương thức hoàn toàn trong lớp B. B thừa kế nó từ A, và vì bản thân B là trừu tượng, bạn không cần thực hiện lại nó một cách rõ ràng.

8

Làm việc cho tôi trong VS2008; không có lỗi, không có cảnh báo. NHƯNG, không có lý do gì để có 'đè' trong B. Mã này là tương đương:

public abstract class A 
{ 
    public abstract void Process(); 
} 

public abstract class B : A 
{ 
} 

public class C : B 
{ 
    public override void Process() 
    { 
     Console.WriteLine("abc"); 
    } 
} 
3

Alon -

Điều này làm cho không có ý nghĩa. Trước hết, điều này thực sự biên dịch tốt. Thứ hai, phương pháp trừu tượng bạn khai báo trong A được thừa hưởng (vẫn còn trừu tượng) vào B. Vì vậy, bạn không cần phải khai báo các Process() trong lớp B.

- Đánh dấu

3

Nơi tôi đã thấy điều này đôi khi là ghi đè một phương thức ảo không trừu tượng với một phương thức trừu tượng. Ví dụ:

public abstract class SomeBaseType 
{ 
    /* Override the ToString method inherited from Object with an abstract 
    * method. Non-abstract types derived from SomeBaseType will have to provide 
    * their own implementation of ToString() to override Object.ToString(). 
    */ 
    public abstract override string ToString(); 
} 

public class SomeType : SomeBaseType 
{ 
    public override string ToString() 
    { 
     return "This type *must* implement an override of ToString()"; 
    } 
} 
+0

Tôi nghĩ rằng tôi biết những gì bạn có ý nghĩa nhưng ví dụ của bạn không phản ánh những gì bạn đang nói. Ít nhất bạn nên thêm một lớp SomeVeryBaseType với phương thức ảo không trừu tượng và để cho SomeBaseType kế thừa từ SomVeryBaseType. –

+0

Đối với những người giả không biết hoặc nhận được điều đó ... như tôi –

+0

@Lieven: Tôi đã thêm một nhận xét để làm rõ rằng phương thức cơ bản bị ghi đè ở đây là 'Object.ToString()'. –

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