2017-01-31 10 views
2

Я пишу решение на основе Factory Pattern на C#.Пользовательские правила - Отключить выполнение конструктора на дочернем классе

Если есть Abstract class под названием Animal, и любой подкласс класса Animal будет создан через Factory Pattern, передав Type.

public abstract class Animal 
{ 
    protected abstract void Constructor(); 

    public Animal() 
    { 
     Constructor(); 
    } 
} 

public class Dog : Animal 
{ 
    protected override void Constructor() 
    { 
     //Constructor Code here 
    } 
} 

Я не привычка любого из моего товарища по команде, чтобы злоупотребить код выше, объявив свой собственный открытый конструктор в своем классе ребенка (например: кошка) и вызовите конструктор непосредственно (например: Animal cat = new Cat();) без использования завод.

Как создать правило анализа кода, которое будет вызывать ошибку при компиляции такого класса?

+0

Честно говоря, я не уверен, что _why_ вы хотели бы сделать это. Что вы можете использовать только с помощью конструкторов? Может быть, вы должны показать нам код для завода? О, и вы также можете прочитать о [CA2214] (https://msdn.microsoft.com/en-us/library/ms182331.aspx) и о [при инициализаторах] (https: //blogs.msdn .microsoft.com/ericlippert/2008/02/18/почему-Do-инициализаторы перспективе-в-противоположному заказ-как-конструкторы-части-два /). –

ответ

-1

, если вы будете добавлять любые parameter или dummy parameter к base class тогда он не будет предлагать default constructor в child classes.

Пример:

public abstract class Animal 
{ 
    protected abstract void Constructor(); 

    public Animal(bool DoNotAllowDefaultConstructor) 
    { 
     Constructor(); 
    } 
} 

Таким образом, производный класс должен сделать явный вызов к базе класса с использованием базового ключевого слова

public class Dog : Animal 
{ 
    protected override void Constructor() 
    { 
     MessageBox.Show("I'm a dog"); 
    } 

    public Dog():base(false) 
    { 
     MessageBox.Show("I'm a dog's default constructor"); 
    } 
} 

Посмотрите here для получения более подробной информации

+0

Теперь вы можете напрямую позвонить Animal myAnimal = new Dog(); // Что не так, он пропускает Factory Pattern – VibeeshanRC

0

Пара вариантов:

Вы можете поместить класс, его производных классов и завод в своей собственной сборки & делают конструкторы классов внутренние. Если метод Factory является общедоступным, то все, что ссылается на сборку, сможет создать его только через Factory.

Другим вариантом является, чтобы сделать завод вложен внутри класса животных, что-то вроде:

public abstract class Animal 
{ 
    protected abstract void Constructor(); 

    protected Animal() 
    { 
     Constructor(); 
    } 

    public class Factory 
    { 
     public static Animal CreateAnimal() 
     { 
      return new Animal(); 
     } 
    } 
} 
+0

. Классы сами должны быть общедоступными, только их конструкторы должны быть внутренними. –

+0

doh, вы абсолютно правы. Я обновлю это! – MartinM