2009-02-04 80 views
47

假設我有一個接口IFoo,並且我希望IFoo的所有子類都覆蓋Object的ToString方法。這可能嗎?強制接口的子類實現ToString

只需添加方法簽名的IFoo這樣不起作用:

interface IFoo 
{ 
    String ToString(); 
} 

,因爲所有的子類擴展Object和提供實現這種方式,所以編譯器不抱怨。有什麼建議麼?

+0

的http:// stackoverflow.com/questions/239408/can-i-force-subclasses-to-override-a-method-without-making-it-abstract < - ?相同?或者只是非常相似? – 2009-02-04 07:25:36

回答

68

我不相信你可以用一個接口做到這一點。您可以使用,雖然抽象基類:

public abstract class Base 
{ 
    public abstract override string ToString(); 
} 
+0

我希望堅持使用接口,因爲我已經寫好了它們,我猜我必須咬緊牙關,切換抽象類。謝謝。 – rjohnston 2009-02-04 10:14:30

+0

偉大的答案(我認爲唯一合理的可能性),但它有一個缺點,在C#的多重繼承缺乏支持。任何必須從Base繼承的類不能從任何其他非Base類繼承,即類MyClass:ThirdPartyClass,Base // mot possible – AlanK 2017-11-14 09:57:18

21
abstract class Foo 
{ 
    public override abstract string ToString(); 
} 

class Bar : Foo 
{ 
    // need to override ToString() 
} 
+1

問題是「我可以使用接口嗎?」,而不是「我該怎麼做?」 ,但無論如何感謝。 – rjohnston 2009-02-04 10:13:33

0

我不認爲你可以強制任何子類覆蓋任何的基類的虛方法,除非這些方法都是抽象的。

1

實現接口方法隱含地密封所述方法(以及覆蓋它)。因此,除非另有說明,否則接口的第一個實現會在C#中結束覆蓋鏈。

Essential .NET

抽象類=你的朋友

檢查this question

6

喬恩&安德魯:抽象訣竅是真正有用的;我不知道你可以通過將其聲明爲抽象來結束鏈。乾杯:)

在過去,當我要求的ToString()在派生類中重寫,我一直使用的模式如下所示:

​​
1

我知道這並不回答你的問題,但因爲沒有辦法做你問什麼,我想我會分享我自己的方法給別人看的。

我用馬克和安德魯提出的解決方案的混合體。

在我的應用程序,所有域實體從一個抽象基類派生:

public abstract class Entity 
{ 
    /// <summary> 
    /// Returns a <see cref="System.String"/> that represents this instance. 
    /// </summary> 
    public override string ToString() 
    { 
     return this is IHasDescription 
        ? ((IHasDescription) this).EntityDescription 
        : base.ToString(); 
    } 
} 

接口本身只定義了一個簡單的訪問:

public interface IHasDescription : IEntity 
{ 
    /// <summary> 
    /// Creates a description (in english) of the Entity. 
    /// </summary> 
    string EntityDescription { get; } 
} 

所以現在有一個回退機制建於 - 或者換句話說,實現IHasDescription必須提供EntityDescriptionEntity,但任何Entity仍然可以轉換爲字符串。

我知道這與本文提出的其他解決方案並沒有根本的不同,但我喜歡減少基類Entity類型責任的想法,因此實現description-interface仍然是可選的,但您被迫如果你正在實現接口,實際上實現了描述方法。

恕我直言,這是由object基類不應該「算」爲實現實現的接口 - 這將是很好,有專門的編譯器選項,但是,很好哦...