强制接口的子类实现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; } } 

所以现在有一个内置的回退机制 – 换句话说,实现IHasDescriptionEntity必须提供EntityDescription ,但是任何Entity仍然可以转换为string。

我知道这与这里提出的其他解决scheme并没有太大的不同,但我喜欢将基本Entitytypes的责任最小化的想法,因此实现描述接口仍然是可选的,但是您不得不实际实现描述 – 方法,如果你正在实现的接口。

恕我直言, object基类实现的接口不应该“计数”实施 – 这将是很好的有一个编译器选项,但是,哦,以及…

我不认为你可以强制任何子类重写任何基类的虚拟方法,除非这些方法是抽象的。