假设我有一个接口IFoo,我希望所有子类都IFoo覆盖Object的ToString方法.这可能吗?
简单地将方法签名添加到IFoo不起作用:
interface IFoo
{
String ToString();
}
Run Code Online (Sandbox Code Playgroud)
因为所有子类都扩展Object并以这种方式提供实现,所以编译器不会抱怨它.有什么建议?
Jon*_*eet 85
我不相信你可以通过界面来做到这一点.您可以使用抽象基类:
public abstract class Base
{
public abstract override string ToString();
}
Run Code Online (Sandbox Code Playgroud)
And*_*ers 21
abstract class Foo
{
public override abstract string ToString();
}
class Bar : Foo
{
// need to override ToString()
}
Run Code Online (Sandbox Code Playgroud)
Jon&Andrew:这个抽象技巧非常有用; 我不知道你可以通过宣称它是抽象的来结束链条.干杯:)
在过去,当我要求在派生类中覆盖ToString()时,我总是使用如下模式:
public abstract class BaseClass
{
public abstract string ToStringImpl();
public override string ToString()
{
return ToStringImpl();
}
}
Run Code Online (Sandbox Code Playgroud)
很抱歉从坟墓中埋葬这个旧线程,特别是因为我们亲爱的@jon-skeet已经提供了他自己的答案。
但是,如果您想保留接口而不使用抽象类,我想这仍然可以通过简单地让您的接口实现System.IFormattable接口来实现。
interface IFoo : IFormattable
{
}
Run Code Online (Sandbox Code Playgroud)
唯一要记住的是,为了正确实现这个 IFormattable,具体的实现也应该覆盖它Object.ToString()。
你的具体类现在就像
public class Bar : IFoo
{
public string ToString(string format, IFormatProvider formatProvider)
{
return $"{nameof(Bar)}";
}
public override string ToString()
{
return ToString(null, System.Globalization.CultureInfo.CurrentCulture);
}
}
Run Code Online (Sandbox Code Playgroud)
希望这仍然可以帮助任何人。