我有一个基类,在初始化派生类之前我想用它来做一些检查。
class BaseClass
{
public BaseClass(Object Param)
{
// Do checks
}
}
我(当然)也有派生类
class NewClass : BaseClass
{
public NewClass(Object Param) : base(Param)
{
// Code here
}
}
现在,我希望出现以下情况
如果基类中的检查失败,那么我希望派生类中的代码(这里是//代码)根本不会被执行。
这可能吗?如果是的话,怎么样?
答案 0 :(得分:9)
不要写“vexing exception”。 派生类必须有一种方法来知道基类ctor是否要抛出。否则你不会让派生类的作者容易防止这个bug。
正确的做法是(1)让派生类的调用者很容易知道是否会抛出异常,并且(2)如果他们没有怜悯就会崩溃他们弄错了。让错误的数据传递给你很痛苦,并且很容易避免这种痛苦,你最终也不会抛出那个异常,因为派生的类会避免这种痛苦。
答案 1 :(得分:3)
你能做的最好的事情就是让基类构造函数抛出异常。
答案 2 :(得分:2)
是否可能,是的,只是抛出异常。然后你可以确定不会调用派生类的代码。这是个好主意吗?也许,但可能不是。在构造函数中抛出异常被认为是不好的形式。
一个不太简单的选项是拥有在基类构造函数中设置的受保护字段/属性isValid
。派生类只能执行填充if(isValid)
。只要你知道你会对自己玩得很好就行了。
答案 3 :(得分:1)
如果检查失败,您可以让基础构造函数抛出异常。
您可以实现所谓的空对象模式,其中您有一个内部isValid
成员。您可以根据对基本构造函数的检查将其设置为false
,如果isValid
为false,则所有方法都不会执行任何操作。
最好的方法是使用工厂模式,这也消除了异常的需要。只需将对象创建委托给执行检查的工厂对象/方法,并根据您的检查创建派生对象。
答案 4 :(得分:0)
是的,这是可能的,只是抛出异常。对象的创建将立即失败,派生的构造函数将不会运行。
答案 5 :(得分:0)
在基类中检查代码后,在基类中设置属性值。您可以在子类中访问它并决定是否继续
class BaseClass
{
public bool IsValid {set;get;}
public BaseClass(Object Param)
{
// Do checks and set the value of property
this.IsValid=false; // or true
}
}
class NewClass : BaseClass
{
public NewClass(Object Param) : base(Param)
{
if(this.IsValid)
{
// Code here
}
}
}