Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用具有静态属性的静态类返回扩展抽象类的具体类的新实例怎么样_C#_Design Patterns_Architecture_Static_Instance - Fatal编程技术网

C# 使用具有静态属性的静态类返回扩展抽象类的具体类的新实例怎么样

C# 使用具有静态属性的静态类返回扩展抽象类的具体类的新实例怎么样,c#,design-patterns,architecture,static,instance,C#,Design Patterns,Architecture,Static,Instance,MyObject有一个形状,形状必须被选择并作为参数传递给执行器,不可能存在一个没有形状的MyObject,并且形状不能随他的生活而变化。这在现实生活中经常发生 namespace JackNova.ConsoleClient.Test.Fun { abstract class Shape { } class Circle : Shape { } class Square : Shape { } class Triangle : Shape { } static class Shapes {

MyObject有一个形状,形状必须被选择并作为参数传递给执行器,不可能存在一个没有形状的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()
    相比,您在使用方面有什么好处
  • 如果有好处的话,我认为使用这些方法而不是属性仍然是有意义的

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

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

      • 与只调用
        new Circle()
        相比,您在使用方面有什么好处
      • 如果有好处的话,我认为使用这些方法而不是属性仍然是有意义的

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


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

      我相信您要做的应该是该工具的功能。例如,VisualStudio的IntelliSense会告诉您可以传递到MyObject的有效类型


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

      我不知道它是否违反了原则,但我非常喜欢这种语法的可读性和表达性


      如果你认为形状是这样,那么每个形状的调用都很重要吗?圆创建了一个新的圆(

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

      如果你认为形状是这样,那么每个形状的调用都很重要吗?圆创建了一个新的圆,

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