【问题标题】:what about using a static class with static properties returning new instances of concrete classes extending an abstract one如何使用具有静态属性的静态类返回扩展抽象类的具体类的新实例
【发布时间】:2011-05-25 11:42:03
【问题描述】:

MyObject 有一个形状,必须选择该形状并将其作为参数传递给 ctor,没有形状就不能存在 MyObject,并且形状不能随他的一生而变化。这在现实生活中经常发生。

namespace JackNova.ConsoleClient.Test.Fun
{
abstract class Shape { }

class Circle : Shape { }
class Square : Shape { }
class Triangle : Shape { }

static class Shapes
{
    public static Circle Circle { get { return new Circle(); } }
    public static Square Square { get { return new Square(); } }
    public static Triangle Triangle { get { return new Triangle(); } }
}

class MyObject
{
    public Shape Shape { get; private set; }

    public MyObject(Shape shape)
    {
        this.Shape = shape;
    }

}

class Test
{
    static void Run()
    {
        MyObject coolOne = new MyObject(Shapes.Circle);
    }
}
}

我认为我在这里违反了一些原则,例如开放式封闭式。 我的目的是在设计时简化开发。正如您所看到的,当我实例化 MyObject 时,我不必记住可以作为参数传递的对象类型,但它们是由抽象类实例化并传递的。

你觉得这很糟糕吗?

【问题讨论】:

标签: c# design-patterns architecture static instance


【解决方案1】:

最好有一个抽象类和一个在构造函数中引用该抽象类的实例并设置有效只读属性的类。

不过,我会质疑您在静态类中对属性的使用:

  • 与仅致电 new Circle() 相比,您在使用方面有何好处?
  • 如果好处,我认为使用这些方法而不是属性仍然是有意义的。

【讨论】:

  • 只需要“类似于可枚举”的东西,但我不需要枚举器......唯一的目的是在设计时,调用 new Circle() 没有什么不同,但调用 new Circle()意味着您知道哪些类扩展了抽象基础,我的 Shapes 类仅用作您可以传递的类的“容器”。
  • @JackNova:好吧,如果你使用Shapes.Circle,你知道你也得到了Circle……但你当然可以使用Shapes.NewCircle() 方法。
  • 以 New 前缀命名的属性呢?
  • @JackNova:我不会。即使使用 New 前缀,属性每次都创建一个新实例有点奇怪。
【解决方案2】:

我相信您尝试做的应该是该工具的功能。例如,Visual Studio 的 IntelliSense 会告诉您可以传递给 MyObject 的有效类型。

此外,属性通常不应有任何副作用。所以 Circle 属性应该是一个 CreateCircle 方法(或类似的方法)。

【讨论】:

    【解决方案3】:

    我不知道它是否违反了原则,但我真的很喜欢这种语法的可读性和表现力。

    如果您认为形状是 value objects,那么每次调用 Shapes.Circle 创建一个新的 Circle 有那么重要吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 2020-03-30
      • 1970-01-01
      • 2013-12-30
      相关资源
      最近更新 更多