停止派生类的初始化

时间:2012-03-20 20:02:20

标签: c# class base

我有一个基类,在初始化派生类之前我想用它来做一些检查。

class BaseClass
{
    public BaseClass(Object Param)
    {
        // Do checks
    }
}

我(当然)也有派生类

class NewClass : BaseClass
{
    public NewClass(Object Param) : base(Param)
    {
        // Code here
    }
}

现在,我希望出现以下情况

如果基类中的检查失败,那么我希望派生类中的代码(这里是//代码)根本不会被执行。

这可能吗?如果是的话,怎么样?

6 个答案:

答案 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
        }
    }
}