【问题标题】:Make interface extend class使接口扩展类
【发布时间】:2017-01-21 04:19:48
【问题描述】:

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

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

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

编辑

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

【问题讨论】:

  • 如果一个字段没有样式 - 因此是一个属性。您真的不想将样式扩展到字段。但是你不能让一个接口继承一个类。
  • 接口不能从一个类继承,只能从其他接口继承。
  • @juharr 我想哈哈,但还是谢谢!我将如何改进?
  • 让接口扩展类...这是不可能的
  • 相反,您可以让 Field1-3 从 Style 继承并实现 Field 接口。附带说明一下,将 Field 重命名为 IField,因为接口的命名约定是将大写 i 放在名称的开头。

标签: c# oop uml datadesign


【解决方案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; }
}

【讨论】:

  • 我所有的课程都是我自己做的,所以我不是指任何现有的课程;-)
  • 我已经用一个为 Style 创建一个名为 IStyle 的接口的示例更新了代码。 IStyle 然后由接口 IField 继承。 Field 类继承自 Style 类,实现了 IField 接口。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    • IStyle 界面
    • StyleBase 抽象类实现 IStyle 和抽象 Draw 方法
    • 扩展 IStyle 的 IField 接口
    • FieldBase 抽象类实现 IField 和抽象 Draw 方法
    • 标签类扩展 StyleBase 并带有一个列表
    • Field1、Field2、Field3 类扩展 FieldBase

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

    【讨论】:

      【解决方案4】:

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

      由于您对 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 */
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-07
        • 2018-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多