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

问题描述

| 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是否有那么重要吗?     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...