2013-04-17 15 views
5

Hãy nói rằng tôi có một giao diện mà nhiều nhiều lớp riêng biệt thực hiện:Giải pháp cho việc không thể đặt mã trong giao diện

public interface IHaveObjects 
{ 
    object firstObject(); 
} 

(Lưu ý: Tôi không thể làm cho nó một lớp cơ sở trừu tượng như implementors của IHaveObjects thể đã có một lớp cơ sở.)

Bây giờ tôi muốn thêm một phương thức mới vào giao diện, để một người triển khai giao diện có thể có hành vi đặc biệt cho giao diện đó. Lý tưởng nhất là tôi sẽ làm một cái gì đó như thế này:

public interface IHaveObjects 
{ 
    object firstObject(); 
    object firstObjectOrFallback() 
    { 
     return firstObject(); 
    } 
} 

sau đó đi đến đó một implementor của giao diện và cung cấp cho nó ghi đè:

public class ObjectHaverPlus : IHaveObjects 
{ 
    public override object IHaveObjects.firstObjectOrFallback() 
    { 
     return firstObject() ?? getDefault(); 
    } 
} 

Tuy nhiên nó bị cấm trong C# để cung cấp một cơ thể phương pháp trong một giao diện và tôi muốn tránh mọi người triển khai IHaveObjects để thả xuống định nghĩa firstObjectOrFallback(). (Hãy tưởng tượng nếu có hàng trăm hoặc hàng nghìn)

Có cách nào để thực hiện việc này mà không cần dán nhiều bản sao không?

+1

Tại sao không tạo giao diện thứ hai cho trường hợp đặc biệt đó? Bạn không thể có nhiều thừa kế các lớp, nhưng bạn có thể thực hiện nhiều giao diện. – Tim

Trả lời

2

Cách giới thiệu giao diện thứ hai kế thừa từ IHaveObjects.

Hơn bạn chỉ phải thay đổi các lớp này, cần giao diện mới với phương pháp mới.

này trông giống như:

interface I1 
    { 
     void Method1(); 
    } 

    interface I2 : I1 
    { 
     void Method2(); 
    } 
+0

Oh ... Tôi thích điều đó ... thậm chí không nghĩ về sự thừa kế trong câu trả lời của tôi. Silly me :) – Tim

+0

Có, nhưng điều này là không thể trong C#. Tôi đã cho anh ta một cách khác. – Tomtom

+0

@Tomtom Tôi nghĩ rằng đây là những gì tôi muốn làm. Nó có nghĩa là làm một kiểm tra khác để xem nếu đối tượng là giao diện mở rộng, nhưng điều đó sẽ được sử dụng tốt.Cảm ơn bạn – Patashu

1

tôi có thể đã hiểu lầm câu hỏi của bạn, nhưng tại sao không sử dụng một giao diện thứ hai, một cái gì đó như:

public interface IHaveObjectsEnhanced 
{ 

    object FirstObjectOrFallback(); 
} 

Sau đó, bạn có thể thực hiện các giao diện đầu tiên và thứ hai:

public class ObjectHaverPlus : IHaveObjects, IHaveObjectsEnhanced 
{ 

    public object FirstObject() 
    { 

    } 

    public object FirstObjectOrFallback() 
    { 
     return FirstObject() ?? GetDefault(); 
    } 

} 
2

Đó là vấn đề với giao diện - chúng không có bất kỳ triển khai mặc định nào để thay đổi ny đối với họ đang phá vỡ các thay đổi - tức là mã cần được sửa đổi để hoạt động với phiên bản giao diện mới.

Vì việc triển khai của bạn đã có các lớp cơ sở riêng - bạn không thể biến nó thành lớp trừu tượng, cũng như không C# có nhiều lớp thừa kế.

Điều bạn có thể làm là suy nghĩ - đó có thực sự là một phương pháp trên giao diện không? Hoặc nó có thể được thực hiện như là một extension method trên giao diện (không thử nhưng tôi cho rằng nó sẽ làm việc tốt)?

Nếu đó là phương pháp trên giao diện và nên ở đó - bạn có thể nghĩ rằng sẽ phá vỡ giao diện này thành hai phần, thứ hai kế thừa từ đầu tiên (IHaveObjectsAndSupportDefault : IHaveObjects) và sử dụng giao diện này. câu trả lời cho biết).

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