问题描述
|
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时,我不必记住那些我可以作为参数传递的对象,但是它们是由抽象类实例化并传递的。
你觉得这很烂吗?
解决方法
最好有一个抽象类和一个在构造函数中引用该抽象类实例的类,并设置一个有效只读的属性。
我会质疑您在静态类中使用属性:
您如何从使用中受益,而不仅仅是打电话给
new Circle()
?
如果有好处,我认为使用这些方法代替属性仍然有意义。
,我相信您要尝试做的应该是该工具的功能。例如,Visual Studio的IntelliSense会告诉您可以传递到MyObject中的有效类型。
而且,特性通常不应有任何副作用。因此,Circle属性实际上应该是CreateCircle方法(或类似的方法)。
,我不知道它是否违反原则,但是我真的很喜欢这种语法的可读性和表达性。
如果您认为形状是值对象,那么每次调用Shapes.Circle都会创建一个新的Circle是否有那么重要吗?