使接口扩展类

时间:2016-09-13 14:09:14

标签: c# oop uml datadesign

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

我根据this帖子使用Field的界面。 Field接口继承自Style类,而Field1,2和3继承自Field接口。我想用一些不同类型的字段构造一个Label对象,每个字段都有自己的样式。我不确定我是否正确地这样做,特别是因为我在尝试编译时遇到以下错误:Type 'Style' in interface list is not an interface

我的代码:

public interface Field : Style
{
    int Xpos { get; set; }
    int Ypos { get; set; }
    int Zindex { get; set; }
}

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

修改

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

4 个答案:

答案 0 :(得分:1)

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

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

如果Style是你自己的班级

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; }
}

答案 1 :(得分:0)

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

就改进设计而言,可以在界面和标签类中定义三个属性(x,y,z)并实现字段界面。它没有字段列表但宁愿实现它,强制它使用draw方法获得属性x,y和z。然后,您的样式将具有一个字段列表,其中可以将实现您的字段界面的任何内容添加到此列表中。然后你可以自信地迭代这个列表并调用draw并知道它在那里,无论绘制的是什么。

答案 2 :(得分:0)

如上所述,界面无法扩展课程,因此我会尝试其他模式。我不知道它是否非常标准,但是在类似场景中,我选择了"接口+基类"图案。你定义:

  • 具有所需最少字段/方法的界面
  • 具有共同功能
  • 的基础(可选摘要)类

这样,当您想要添加功能时,您可以选择扩展基类或从头开始实现接口。

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

  • IStyle界面
  • StyleBase抽象类实现IStyle并使用抽象Draw方法
  • IField接口扩展IStyle
  • FieldBase抽象类实现IField和抽象Draw方法
  • 标签类扩展StyleBase并使用List
  • Field1,Field2,Field3类扩展FieldBase

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

答案 3 :(得分:0)

当继承失败,或者比它解决的问题更多时,组合很可能是最佳选择。

由于你并没有真正说明Draw()方法,我只是假设它与这里的问题无关。

我认为在这里解决问题的一个好方法是使用Style类构建Field接口和Label类。

我建议的是这样的:

CURRENT_TIMESTAMP