关于c#:Make接口扩展类

Make interface extend class

我有以下情况,但我觉得我做错了什么…enter image description here

根据本文,我为Field使用了一个接口。Field接口继承Style类,field1、2、3继承Field接口。我想用两个不同类型的字段构造一个Label对象,每个字段都有自己的样式。我不确定这样做是否正确,尤其是因为我在编译时遇到以下错误:Type 'Style' in interface list is not an interface

我的代码:

1
2
3
4
5
6
public interface Field : Style
{
    int Xpos { get; set; }
    int Ypos { get; set; }
    int Zindex { get; set; }
}

解决这个问题的最佳方法是什么?

编辑

我知道从接口继承类是不可能的,但是这里最好的方法是什么?


查找/创建样式使用的接口,并在字段接口上继承该接口。

注意,字段接口应命名为ifeld。

如果风格是你自己的班级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public interface IStyle
{
    /* Style properties */
}
public class Style : IStyle
{
    /* Style implementations */
}

public interface IField : IStyle
{
    int Xpos { get; set; }
    int Ypos { get; set; }
    int Zindex { get; set; }
}

public class Field : Style, IField
{
    public int Xpos { get; set; }
    public int Ypos { get; set; }
    public int Zindex { get; set; }
}


当继承失败,或者造成比它解决的问题更多的麻烦时,组合最有可能是解决问题的方法。

由于您对draw()方法没有太多的了解,所以我假设它与这里的问题无关。

我认为解决这个问题的一个好方法是用样式类组合字段接口和标签类。

我的建议是这样的:

1
2
3
4
5
6
7
8
9
public interface IField {
    Style style {get;set}
    /* Your property */
}
public class Label {
    Style style {get;set}
    IField field {get;set}
    /* Your property */
}


如前所述,接口不能扩展类,所以我将尝试另一种模式。我不知道它是否是相当标准的,但是在类似的场景中,我选择了"接口+基类"模式。你定义:

  • 具有所需最小字段/方法的接口
  • 具有公共功能的基(可选抽象)类

这样,当您想要添加特性时,您可以在扩展基类或从头实现接口之间进行选择。

在您的情况下,它取决于可能扩展的方向,但示例结构可能是:

  • IStyle接口
  • StyleBase抽象类实现IStyle并使用抽象绘制方法
  • ifeld接口扩展istyle
  • FieldBase抽象类实现了IFELD和WITH以及抽象绘图方法
  • 用列表扩展StyleBase的标签类
  • Field1、Field2、Field3类扩展FieldBase

如我所说,这只是一个例子,它取决于潜在的扩展点。


我认为,您正在努力解决的问题是接口的目的。接口为类定义实现类中存在的公共成员和方法。这允许您创建一个类型(接口名称)的变量,然后为它分配实现接口的任何实例化类的值。

对于改进设计,可以在接口和标签类中定义三个属性(X、Y、Z),并实现字段接口。它没有字段列表,但更愿意实现它,强制它使用draw方法具有属性x、y和z。然后,您的样式将有一个字段列表,其中实现字段接口的任何内容都可以添加到此列表中。然后,您可以自信地遍历这个列表,调用draw并知道它在那里,而不管draw实际上做什么。