我只是在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时会自动调用它。
答案 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");
}
}