定义与接口强连接的方法的正确方法

本文关键字:方法 连接 接口 定义 | 更新日期: 2023-09-27 18:01:32

我有以下接口:

interface IName
{
    string Name { get; }
}

和一些基类BaseClass。这个类的子类可以实现IName接口,但不是所有的都实现。

如果Child实现了IName,我也想重写ToString()方法,在所有情况下都完全相同,如下所示:

public override string ToString()
{
    return Name;
}

似乎重写ToString()的好地方是在IName接口中,但我认为这在c#中是不可能的。在每个类中实现ToString()似乎也是一个坏主意,因为它有很多代码冗余(并且浪费时间)。

对于这种情况,什么是合适的解决方案?

定义与接口强连接的方法的正确方法

我建议创建第二个基类:

public abstract class BaseClass
{
    // your base class implementation
}
public abstract class NamedBaseClass : BaseClass, IName
{
    public string Name { get; set;}
    public override string ToString()
    {
        return Name;
    }
}

这样,如果你想让一个子类同时实现BaseClass和IName,那么你应该继承NamedBaseClass。根据你的话,"有些可能实现IName和一些不",那么BaseClass不应该实现IName,但你仍然应该有一些基本的实现。这就是我的解决方案。

编辑:

创建一个返回名称的类,与BaseClass无关,然后您可以为此创建一个不相关的抽象实现:

public abstract class NameStringClass : IName
{
     public string Name { get; set; }
     public override string ToString()
     {
          return Name;
     }
}

考虑cFoo作为具有IName的子类。cBar是父类,cBaz是不实现IName的类。

public interface IName
{
    string Name { get; }
}
public class CBaz : CBar
{
}
public class CFoo : CBar, IName 
{
    public CFoo(string name)
    {
        Name = name;
    }
    public string Name { get; }
}
abstract public class CBar 
{
    public override string ToString()
    {
        if (this is IName)
        {
            var temp = (IName) (this);
            return temp.Name;
        }
        else
        {
            return base.ToString();
        }
    }
}

(老回答)注意,接口本质上是空的。您需要将接口视为承载更多契约含义的接口,这意味着实现该接口的人需要实现此类签名的属性/方法/字段等。

对于可能由许多类共同共享的特定于实现的任务,抽象类更合适。

当你需要解决某种逻辑的时候,你必须经过一个实现的网关,一些实现必须发生,接口本质上是空模板。实现这一点的最宽松的方式是通过一个包含name属性和ToString重写的抽象类,然后您可以继承所有后续类。

同时,您可以考虑为您的CBar类创建一个抽象类。以及调用基方法base. tostring()。[旧答案结束]