C#:重写继承的方法,但不适用于整个类

本文关键字:适用于 不适用 重写 继承 方法 | 更新日期: 2023-09-27 18:20:09

我只是在玩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继承时会自动调用它。

C#:重写继承的方法,但不适用于整个类

否,您不能选择性地覆盖Init方法,但通过使Init方法虚拟化,您可以指定要使用basethis关键字调用的方法的版本:

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();
    }
}

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

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

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

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

您也可以选择这样做。

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");
    }
}