C#:覆盖继承的方法,但不是整个类

时间:2014-08-29 14:27:19

标签: c# polymorphism

我只是在C#中继承了一些继承和/或多态,并且因为我的OOP技能非常非常基础我想知道这是否可行:

我有一个继承基类方法的类:

class BaseClass {
    public void Init () {
        // Do basic stuff.
    }
}

class LoginTest : BaseClass {
    public void StraightMethod () {
        // Do stuff based on the actions in the inherited Init() method from BaseClass.
    }

    public void ExceptionMethod () {
        // Do stuff where I don't want to do the actions in the inherited method.
        // That is, skip or override the Init() method in the BaseClass class.
    }
}

我知道我可以覆盖整个类的Init()方法,但是是否可以仅使用ExceptionMethod()方法覆盖它或其中的代码?这些方法是专门运行的,因此例如LoginTest类的一次初始化只会运行LoginClass.ExceptionMethod(),而另一种可能会运行LoginClass.StraightMethod()

是的,我知道好的设计将消除对此类事物的需求。但首先,我不是在这里做软件工程,所以在不破坏某些设计原则或其他原则的情况下务实是务实的。其次,这更多的是一个问题,即是否可以做某事,而不是它的明智性。

请注意,这些类和方法是UnitTest方法,因此Init()方法是[TestInitialize]方法。因此,当LoginTest继承自BaseClass时会自动调用它。

4 个答案:

答案 0 :(得分:3)

不,您无法有选择地覆盖Init方法,但通过将Init方法设为虚拟,您可以使用base指定要调用的方法版本和this关键字:

class BaseClass
{
    // This method must become virtual
    public virtual void Init()
    {
        // Do basic stuff.
    }
}

class LoginTest : BaseClass
{
    public override void Init()
    {
        // Other stuff
    }

    public void StraightMethod()
    {
        // Do stuff based on the actions in the inherited Init() method from BaseClass.
        base.Init();
    }

    public void ExceptionMethod()
    {
        // Do stuff where I don't want to do the actions in the inherited method.
        // That is, skip or override the Init() method in the BaseClass class.
        this.Init();
    }
}

答案 1 :(得分:0)

该方法不是虚拟的,因此根本无法覆盖它。

答案 2 :(得分:0)

您无法有条件地覆盖该方法,但您可以单独调用每个方法(如果您在基类中提供基本功能)。

class BaseClass {
    public virtual void Init () {
        // Do basic stuff.
    }

}

class LoginTest : Baseclass {

    public override void Init() {
        //do overridden stuff
    }
    public void StraightMehthod () {
        this.Init(); // Call the overridden
    }

    public void ExceptionMethod () {
        base.Init(); // Call the base specifically
    }
}

正如您所说,这可能不是您想要做的事情,因为使用此代码的人会对此行为感到非常困惑。

答案 3 :(得分:-1)

您也可以选择这样做。

class BaseClass
{
    public void Init()
    {
        // Do basic stuff.
        Console.WriteLine("BaseClass.Init");
    }
}

class LoginTest : BaseClass
{
    public void StraightMehthod()
    {
        // Do stuff based on the actions in the inherited Init() method from BaseClass.
        base.Init();
    }

    public void ExceptionMethod()
    {
        // Do stuff where I don't want to do the actions in the inherited method.
        this.Init();
        // That is, skip or override the Init() method in the BaseClass class.
    }

    private new void Init()
    {
        Console.WriteLine("LoginTest.Init");
    }
}