将创建对象的决定留给 C# 中的构造函数
本文关键字:构造函数 创建对象 决定 | 更新日期: 2023-09-27 18:31:08
有没有办法拒绝在构造函数方法中创建对象?
我的观点是设置一个与条件相关的额外参数。例如:
public Test(Rule rule){
if(rule == Rule.Custom)
//DO NOT CREATE
else{
this.rule = rule;
}
}
//WORK IF rule IS Custom
//I want to pass this information to user
public Test(Rule rule, string extra){
if(rule != Rule.Custom)
//DO NOT CREATE
else{
this.rule = rule;
this.extra = extra;
}
}
也许我可以制作一个工厂方法,但我对解决方法感到好奇。
如果您的目的是不抛出异常,而只是不创建对象,那么工厂方法是您唯一真正的选择。它有两个模型:
- 如果不满足条件,则返回 null。
- 使用
bool TryCreate(parameters ..., out Result)
签名,其中布尔值返回到表示成功或失败的调用。
当然,这些的真正问题是调用方无法知道对象创建失败的原因,并且需要查阅一些带外信息(文档)以获取更多信息。
听起来这种模式应该使用ArgumentOutOfRangeException。
更改示例代码以显示此想法:
public Test(Rule rule)
{
if (rule == Rule.Custom)
{
throw new ArgumentOutOfRangeException("rule", "A custom rule is not allowed");
}
this.rule = rule;
}
public Test(Rule rule, string extra)
{
if (rule != Rule.Custom)
{
throw new ArgumentOutOfRangeException("rule", "Only a custom rule is allowed");
}
this.rule = rule;
this.extra = extra;
}
来自C++背景,我发现自己越来越多地使用参数例外,而我过去可能使用断言。
希望这有帮助,
附言从构造函数引发的异常是完全可以接受的...
您可以引发异常。 这将中止对象的创建,并向调用方发出错误信号。
public Test(Rule rule){
if(rule == Rule.Custom)
throw new WillNotCreateException();
else{
this.rule = rule;
}
}
其中WillNotCreateException
是您的自定义异常类型或常见异常类型之一(例如 System.ArgumentException
)