2015-04-27 20 views
5

Câu hỏi rất ngắn, nhưng tôi không tìm thấy giải pháp.Ghi đè phương thức chồng chéo

Giả sử chúng ta có hệ thống phân cấp lớp

public abstract class A 
{ 
    public virtual string Print() { return "A"; } 
} 

public class B : A 
{ 
    public virtual new string Print() { return "B"; } 
} 

public class C : B 
{ 
    public override string Print() { return "C"; } 
} 

Có thể ghi đè A.Print trong lớp C? Tôi cố gắng để làm điều đó giao diện thực hiện như rõ ràng:

string A.Print() { return "C"; } 

nhưng ở đây tôi nhận được một lỗi:

'A' in explicit interface declaration is not an interface

tôi nghĩ rằng nó không thể ở tất cả, nhưng sẽ đánh giá cao nhận bất kỳ thông tin bổ sung

+0

Câu hỏi của bạn đã gắn thẻ cả C# và CIL. Bạn có muốn làm điều này trong C# hay bạn mở để viết 'C' trong CIL? – svick

+0

@svick bởi vì tôi không chắc chắn nếu nó có thể hay không trong C# hoặc IL cả hai, do đó, xem một câu trả lời của Brian. Bây giờ bạn nhận được lý do tại sao tôi thêm thẻ cil cho câu hỏi :) –

Trả lời

5

Bạn không thể bằng C#, nhưng bạn có thể bằng IL sử dụng từ khóa .override để ghi đè vị trí mà vtable sẽ sử dụng. (Lưu ý: tên phương pháp Namespace.A.Print là không đáng kể, trong đó có loại tên đầy đủ trong tên phương pháp chỉ là một cách hữu hiệu để tránh va chạm, trong cùng một cách như C# làm cho việc triển khai giao diện rõ ràng)

.class public auto ansi beforefieldinit Namespace.C 
    extends [x]Namespace.B 
{ 
    .method private hidebysig virtual 
     instance string Namespace.A.Print() cil managed 
    { 
     .override method instance string [x]Namespace.A::Print() 
     .maxstack 1 
     ldstr "C" 
     ret 
    } 
} 
+0

Để sử dụng IL, +1! Badassery tinh khiết :) –

1

Tôi chưa thử, nhưng bạn có thể dễ dàng -

interface IA 
{ 
    string Print(); 
} 

interface IB 
{ 
    string Print(); 
} 


public abstract class A : IA 
{ 
    IA.Print() { return "A"; } 
} 

public class B : IB, A 
{ 
    IB.Print() { return "B"; } 
} 
Các vấn đề liên quan