如何使用带静态属性的静态类返回扩展抽象类的具体类的新实例

时间:2011-05-25 11:42:03

标签: c# design-patterns architecture static instance

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

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时所看到的那样,我不必记住那些我可以作为参数传递的对象,但它们是实例化的并由抽象类传递。

你认为这很糟糕吗?

3 个答案:

答案 0 :(得分:3)

有一个抽象类和一个类,它可以在构造函数中引用该抽象类的实例,并设置一个有效的readonly属性。

我会质疑你在静态类中使用属​​性:

  • 如果只是致电new Circle()
  • ,您如何从中受益?
  • 如果 是一个好处,我认为制作这些方法而不是属性仍然有意义。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

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