【问题标题】:Share const variable between interface implementations在接口实现之间共享 const 变量
【发布时间】:2013-10-31 11:05:38
【问题描述】:

我有以下示例结构:

public interface IWidget {
    void Draw();
}

public class SmallWidget : IWidget {
    public void Draw() {
        rectangle.Draw(WIDGET_WIDTH, smallWidgetHeight);
    }
}

public class MediumWidget : IWidget {
    public void Draw() {
        rectangle.Draw(WIDGET_WIDTH, mediumWidgetHeight);
    }
}

public class LargeWidget : IWidget {
    public void Draw() {
        rectangle.Draw(WIDGET_WIDTH, largeWidgetHeight);
    }
}

WIDGET_WIDTH 变量对于IWidget 接口的所有实现都是相同的。显然我不能在界面上定义它。

我在哪里定义这个const

【问题讨论】:

  • 在抽象类中? PS:接口声明了一个契约,而不是实现。

标签: c# oop interface constants


【解决方案1】:

为所有小部件创建一个具有通用实现细节的基类,并从这个基类而不是直接从接口派生所有小部件。这样所有的小部件都必须遵守IWidget接口,您可以一次定义它们的共同行为。

public abstract class WidgetBase : IWidget {
    public const int WIDGET_WIDTH = 100;
    public abstract void Draw();
}

public class SmallWidget : WidgetBase {
    public override void Draw() {
        rectangle.Draw(WIDGET_WIDTH, smallWidgetHeight);
    }
}

【讨论】:

  • 我将此标记为答案,因为我没有意识到我可以将接口实现标记为抽象类中的抽象。我过去曾以class MyWidget : IWidget, WidgetBase 的形式实现过,这并不好。谢谢!
【解决方案2】:

你真正想要的似乎是一个抽象类

public abstract class Widget {

    public const WIDGET_WIDTH = 123;
    public abstract void Draw();
}

public class SmallWidget : Widget {
    public override void Draw() {
        rectangle.Draw(WIDGET_WIDTH, smallWidgetHeight);
    }
}

【讨论】:

    【解决方案3】:

    您可以为此创建一个抽象基类。我个人认为这有点限制。我可能会使用一个静态类来进一步解耦:

    public static class WidgetConsts
    {
        public const int WIDGET_WIDTH = 666;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多