3

我有以下情况,但我觉得我做错了什么...... 在此处输入图像描述

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

4 回答 4

1

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

注意,字段接口应命名为 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; }
}
于 2016-09-13T14:23:35.197 回答
0

当继承失败或制造的麻烦多于解决的问题时,组合很可能是要走的路。

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

我认为在这里解决您的问题的一个好方法是将您的 Field 接口和您的 Label 类与 Style 类组合在一起。

我的建议是这样的:

public interface IField {
    Style style {get;set}
    /* Your property */
}
public class Label {
    Style style {get;set}
    IField field {get;set}
    /* Your property */
}
于 2016-09-13T15:03:07.373 回答
0

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

就改进您的设计而言,您的三个属性 (x,y,z) 可以在您的界面和标签类中定义并实现您的字段界面。它不会有一个字段列表,而是宁愿实现它,通过 draw 方法强制它具有 x、y 和 z 属性。然后,您的样式将有一个字段列表,可以将实现您的字段接口的任何内容添加到此列表中。然后,您可以自信地遍历此列表并调用 draw 并知道它在那里,而不管 draw 实际做什么。

于 2016-09-13T14:21:10.300 回答
0

如前所述,接口不能扩展类,所以我将尝试另一种模式。我不知道它是否很标准,但是当涉及到类似的场景时,我选择“接口+基类”模式。你定义:

  • 具有所需最少字段/方法的界面
  • 具有通用功能的基类(可选抽象)

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

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

  • 风格界面
  • StyleBase 抽象类实现 IStyle 并带有抽象 Draw 方法
  • 扩展 IStyle 的 IField 接口
  • FieldBase 抽象类实现 IField 和 with 和抽象 Draw 方法
  • 扩展 StyleBase 并带有 List 的标签类
  • Field1、Field2、Field3 类扩展 FieldBase

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

于 2016-09-13T14:24:37.890 回答