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

时间:2017-01-31 08:19:45

标签: c# visual-studio oop roslyn roslyn-code-analysis

我正在用C#编写基于工厂模式的解决方案。

Abstract class Animal被调用Animalpublic 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();

我不会通过在他们的子类(例如:cat)中声明自己的公共构造函数并且直接调用构造函数(例如: let destinationPath = NSURL(string: VideoFilePath)! let sourceAsset = AVURLAsset(url: inputURL as URL, options: nil) let assetExport: AVAssetExportSession = AVAssetExportSession(asset: sourceAsset, presetName: AVAssetExportPresetLowQuality)! assetExport.outputFileType = AVFileTypeQuickTimeMovie assetExport.outputURL = savePathUrl as URL assetExport.exportAsynchronously { () -> Void in switch assetExport.status { case AVAssetExportSessionStatus.completed: DispatchQueue.main.async { do { let videoData = try NSData(contentsOf: savePathUrl as URL, options: NSData.ReadingOptions()) // self.sendVideoMessage(sender: self.appDelegate.xmppStream!, vidoeData: videoData as NSData, senderJID: self.rosterInfo.jid!,duration: assetExport.asset.duration) } catch { print(error) } } case AVAssetExportSessionStatus.failed: print("failed \(assetExport.error)") case AVAssetExportSessionStatus.cancelled: print("cancelled \(assetExport.error)") default: print("Task Done") } } )而不让我的团队伙伴滥用上述代码使用工厂。

如何创建在编译此类时会抛出错误的代码分析规则?

2 个答案:

答案 0 :(得分:0)

几个选项:

您可以将类,派生类和工厂放入自己的程序集和组件中。制作课程'建设者内部。如果Factory方法是public,则引用程序集的任何内容都只能通过Factory创建它。

另一种选择是使Factory嵌套在Animal类中,例如:

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

    protected Animal()
    {
        Constructor();
    }

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

答案 1 :(得分:-1)

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

查看here以获取更多详细信息