как насчет использования статического класса со статическими свойствами, возвращающего новые экземпляры конкретных классов, расширяющих абстрактный - PullRequest
1 голос
/ 25 мая 2011

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, мне не нужно запоминать, какие объекты я могу передать в качестве аргумента, но они создаются и передаются абстрактным классом.

Как вы думаете, это отстой?

Ответы [ 3 ]

3 голосов
/ 25 мая 2011

Хорошо иметь абстрактный класс и класс, который берет ссылку на экземпляр этого абстрактного класса в конструкторе и устанавливает свойство, эффективно читаемое.

Я бы поставил под сомнение использование вами свойств в статическом классе:

  • Какую пользу вы получаете от простого звонка new Circle()?
  • Если бы принесло выгоду, я думаю, что все же имеет смысл использовать эти методы вместо свойств.
2 голосов
/ 25 мая 2011

Я считаю, что то, что вы пытаетесь сделать, должно быть функцией инструмента. Например, IntelliSense в Visual Studio сообщит вам допустимые типы, которые можно передать в MyObject.

Кроме того, свойства обычно не должны иметь побочных эффектов. Таким образом, свойство Circle действительно должно быть методом CreateCircle (или чем-то подобным).

0 голосов
/ 25 мая 2011

Я не знаю, нарушает ли это принцип, но мне очень нравится читаемость и выразительность этого синтаксиса.

Если вы считаете, что фигуры являются объектами значения , имеет ли это значениестолько, что каждый вызов Shapes.Circle создает новый круг?

...