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时所看到的那样,我不必记住那些我可以作为参数传递的对象,但它们是实例化的并由抽象类传递。
你认为这很糟糕吗?
答案 0 :(得分:3)
有一个抽象类和一个类,它可以在构造函数中引用该抽象类的实例,并设置一个有效的readonly属性。
我会质疑你在静态类中使用属性:
new Circle()
?答案 1 :(得分:2)
我相信你要做的事情应该是这个工具的功能。例如,Visual Studio的IntelliSense会告诉您可以传递给MyObject的有效类型。
此外,属性通常不应有任何副作用。所以Circle属性应该是CreateCircle方法(或类似的东西)。
答案 2 :(得分:0)
我不知道它是否违反了原则,但我真的很喜欢这种语法的可读性和表现力。
如果你认为形状是value objects,那么每次调用Shapes.Circle创建一个新的圆圈是否重要?