强制接口的子类来实现ToString

rjo*_*ton 60 c# oop

假设我有一个接口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)

  • 问题是"我可以用界面做这个吗?",而不是"我该怎么做?",但无论如何,谢谢. (6认同)

Mar*_*son 8

Jon&Andrew:这个抽象技巧非常有用; 我不知道你可以通过宣称它是抽象的来结束链条.干杯:)

在过去,当我要求在派生类中覆盖ToString()时,我总是使用如下模式:

public abstract class BaseClass
{
    public abstract string ToStringImpl();

    public override string ToString()
    {
        return ToStringImpl();
    }    
}
Run Code Online (Sandbox Code Playgroud)


Seb*_* T. 6

很抱歉从坟墓中埋葬这个旧线程,特别是因为我们亲爱的@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)

希望这仍然可以帮助任何人。