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继承时会自动调用它。
否,您不能选择性地覆盖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();
}
}
该方法不是虚拟的,因此根本不可能覆盖它。
您不能有条件地重写该方法,但您可以单独调用每个方法(如果您在基类中提供基本功能)。
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");
}
}