我正在用C#编写基于工厂模式的解决方案。
Abstract class
Animal
被调用Animal
,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();
我不会通过在他们的子类(例如: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")
}
}
)而不让我的团队伙伴滥用上述代码使用工厂。
如何创建在编译此类时会抛出错误的代码分析规则?
答案 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)
如果您要将任何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");
}
}
查看here以获取更多详细信息