假設我有一個接口IFoo
,並且我希望IFoo
的所有子類都覆蓋Object的ToString
方法。這可能嗎?強制接口的子類實現ToString
只需添加方法簽名的IFoo這樣不起作用:
interface IFoo
{
String ToString();
}
,因爲所有的子類擴展Object
和提供實現這種方式,所以編譯器不抱怨。有什麼建議麼?
假設我有一個接口IFoo
,並且我希望IFoo
的所有子類都覆蓋Object的ToString
方法。這可能嗎?強制接口的子類實現ToString
只需添加方法簽名的IFoo這樣不起作用:
interface IFoo
{
String ToString();
}
,因爲所有的子類擴展Object
和提供實現這種方式,所以編譯器不抱怨。有什麼建議麼?
我不相信你可以用一個接口做到這一點。您可以使用,雖然抽象基類:
public abstract class Base
{
public abstract override string ToString();
}
abstract class Foo
{
public override abstract string ToString();
}
class Bar : Foo
{
// need to override ToString()
}
問題是「我可以使用接口嗎?」,而不是「我該怎麼做?」 ,但無論如何感謝。 – rjohnston 2009-02-04 10:13:33
我不認爲你可以強制任何子類覆蓋任何的基類的虛方法,除非這些方法都是抽象的。
喬恩&安德魯:抽象訣竅是真正有用的;我不知道你可以通過將其聲明爲抽象來結束鏈。乾杯:)
在過去,當我要求的ToString()在派生類中重寫,我一直使用的模式如下所示:
我知道這並不回答你的問題,但因爲沒有辦法做你問什麼,我想我會分享我自己的方法給別人看的。
我用馬克和安德魯提出的解決方案的混合體。
在我的應用程序,所有域實體從一個抽象基類派生:
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
必須提供EntityDescription
的Entity
,但任何Entity
仍然可以轉換爲字符串。
我知道這與本文提出的其他解決方案並沒有根本的不同,但我喜歡減少基類Entity
類型責任的想法,因此實現description-interface仍然是可選的,但您被迫如果你正在實現接口,實際上實現了描述方法。
恕我直言,這是由object
基類不應該「算」爲實現實現的接口 - 這將是很好,有專門的編譯器選項,但是,很好哦...
的http:// stackoverflow.com/questions/239408/can-i-force-subclasses-to-override-a-method-without-making-it-abstract < - ?相同?或者只是非常相似? – 2009-02-04 07:25:36