强制接口实现在c#中实现层次结构

tom*_*szs 4 c# design-patterns interface hierarchy

我正在为新项目编写接口,并希望得到一些建议.

我有一个具有子类的类,它有一个子类.这个类的树是这样的:

Class Car
{
    Wheels Wheel;
}
Class Wheels
{
    Rims Rim;
}
Run Code Online (Sandbox Code Playgroud)

因此,为了简化:一辆车有一个车轮,一个车轮有一个车轮.(不能弥补其他更好的例子,对不起).

所以我想在我的ICar,IWheels和IRims的接口实现中强制这个层次结构.

所以我做了这样的事情(在C#中):

ICar
{
  IWheels Wheel;
}
IWheels
{
  IRims Rim;
}
Run Code Online (Sandbox Code Playgroud)

我有一个错误,我不能在接口实现中有字段.所以这开始我的事情可能是错误的界面设计.我想强制接口实现来实现这种层次结构.但是,如果按照设计模式和最佳实践,它应该以其他方式完成吗?

您能告诉我如何设计我的系统,以便强制对象实现这种层次结构吗?

也许在我的问题中有一些不精确的东西,或者我错过了一些重要信息.如果是,请在评论中提问.

Fre*_*els 10

在您的界面中,您必须明确Wheels应该是ICar的属性,因为您无法声明接口实现应该具有哪些字段.(字段是内部工作,因此接口不应该知道它).

interface ICar
{
    IWheels Wheels
    {
       get;
    }
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 7

您不能在接口中指定字段(并且您不应该 - 这是一个实现决策),但您可以指定一个属性:

public interface ICar
{
    IWheels Wheel { get; set; }
}

public interface IWheels
{
    IRims Rim { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

你可能只想把getter放在接口中 - 在接口中包含一个setter有点不寻常:

public interface ICar
{
    IWheels Wheel { get; }
}

public interface IWheels
{
    IRims Rim { get; }
}
Run Code Online (Sandbox Code Playgroud)

(如果你想覆盖现有的(或抽象的)属性只有一个getter来添加一个setter,那就有些奇怪了,但我相信也可以用setter实现一个"getter-only"接口.)