我正在用C#编写一个基于工厂模式的解决方案。
如果存在称为Animal
Abstract class
,则Animal
的任何子类都将通过传递 Type 通过工厂模式进行实例化。
public abstract class Animal
{
protected abstract void Constructor();
public Animal()
{
Constructor();
}
}
public class Dog : Animal
{
protected override void Constructor()
{
//Constructor Code here
}
}
我不会让我的任何队友通过在他们的子类(例如:cat)中声明自己的公共构造函数来滥用上述代码,并在不使用工厂的情况下直接调用构造函数(例如:Animal cat = new Cat();
)。
如何创建在编译此类时会抛出错误的代码分析规则?
几个选项:
您可以将类、其派生类和工厂放入其自己的程序集中,并使类的构造函数成为内部函数。如果 Factory 方法是公共的,则引用程序集的任何内容都只能通过工厂创建它。
另一种选择是将工厂嵌套在 Animal 类中,如下所示:
public abstract class Animal
{
protected abstract void Constructor();
protected Animal()
{
Constructor();
}
public class Factory
{
public static Animal CreateAnimal()
{
return new Animal();
}
}
}
如果您将任何parameter
或dummy parameter
添加到base class
,则它不会提供default constructor
child classes.
例:
public abstract class Animal
{
protected abstract void Constructor();
public Animal(bool DoNotAllowDefaultConstructor)
{
Constructor();
}
}
这样,派生类必须使用 base 关键字显式调用基类构造函数
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");
}
}
查看此处以获取更多详细信息