自定义规则 - 禁用子类上的构造函数实现



我正在用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();
        }
    }
}  

如果您将任何parameterdummy 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");
    }
} 

查看此处以获取更多详细信息

最新更新