强制接口的子类实现ToString
假设我有一个接口IFoo
,我希望IFoo
所有子类重写Object的ToString
方法。 这可能吗?
简单地将方法签名添加到IFoo是行不通的:
interface IFoo { String ToString(); }
因为所有的子类都扩展了Object
并提供了一个实现,所以编译器不会抱怨它。 有什么build议么?
我不相信你可以通过界面来做到这一点。 你可以使用一个抽象基类:
public abstract class Base { public abstract override string ToString(); }
abstract class Foo { public override abstract string ToString(); } class Bar : Foo { // need to override ToString() }
乔恩和安德鲁:那个抽象的技巧真的很有用, 我不知道你可以通过将其声明为抽象来结束链。 干杯:)
在过去,当我需要在派生类中重写ToString()时,我总是使用如下的模式:
public abstract class BaseClass { public abstract string ToStringImpl(); public override string ToString() { return ToStringImpl(); } }
实现一个接口方法隐式地封装该方法(以及覆盖它)。 因此,除非另有说明,接口的第一个实现将在C#中结束覆盖链。
基本的.NET
抽象类=你的朋友
检查这个问题
我知道这并不能回答你的问题,但由于没有办法做你要求的东西,所以我想我会分享我自己的方法让别人看到。
我使用马克和安德鲁提出的解决scheme的混合。
在我的应用程序中,所有域实体都是从一个抽象的基类中派生的:
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
的Entity
必须提供EntityDescription
,但是任何Entity
仍然可以转换为string。
我知道这与这里提出的其他解决scheme并没有太大的不同,但我喜欢将基本Entity
types的责任最小化的想法,因此实现描述接口仍然是可选的,但是您不得不实际实现描述 – 方法,如果你正在实现的接口。
恕我直言, object
基类实现的接口不应该“计数”实施 – 这将是很好的有一个编译器选项,但是,哦,以及…
我不认为你可以强制任何子类重写任何基类的虚拟方法,除非这些方法是抽象的。