定义与接口强连接的方法的正确方法
本文关键字:方法 连接 接口 定义 | 更新日期: 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()。[旧答案结束]