3 回答
TA贡献1830条经验 获得超9个赞
只想在此处添加此内容,因为即使经过很多时间,人们仍然会回到这个问题。当然,这是不好的做法,但原则上仍然有可能做作者想要做的事情:
class SpecialDerived : Derived
{
public override void Say()
{
Console.WriteLine("Called from Special Derived.");
var ptr = typeof(Base).GetMethod("Say").MethodHandle.GetFunctionPointer();
var baseSay = (Action)Activator.CreateInstance(typeof(Action), this, ptr);
baseSay();
}
}
TA贡献1799条经验 获得超9个赞
这是一种不良的编程习惯,在C#中是不允许的。这是不好的编程习惯,因为
grandbase的细节是base的实现细节;你不应该依赖他们。基类提供了Grandbase的抽象层。您应该使用该抽象,而不是构建旁路来避免这种抽象。
您之所以从您的基础派生出来,是因为您喜欢它的功能,并且想要重用和扩展它。如果您不喜欢它的功能,而是想要解决它而不是使用它,那么为什么您首先要从中得到呢?如果这是您要使用和扩展的功能,请自己从数据库中派生。
该库可能出于安全性或语义一致性目的而需要某些不变式,这些不变式由该库如何使用Grandbase方法的详细信息维护。允许基类的派生类跳过维护那些不变式的代码,可能会使基类处于不一致的损坏状态。
TA贡献1725条经验 获得超7个赞
答案(我知道这不是您要找的东西)是:
class SpecialDerived : Base
{
public override void Say()
{
Console.WriteLine("Called from Special Derived.");
base.Say();
}
}
事实是,您只能与您继承的类进行直接交互。将该类视为一个层-根据其派生类的需要,提供或多或少提供其父类的功能。
编辑:
您的编辑有效,但我想我会使用以下内容:
class Derived : Base
{
protected bool _useBaseSay = false;
public override void Say()
{
if(this._useBaseSay)
base.Say();
else
Console.WriteLine("Called from Derived");
}
}
当然,在实际的实现中,您可能会为扩展性和可维护性做更多类似的事情:
class Derived : Base
{
protected enum Mode
{
Standard,
BaseFunctionality,
Verbose
//etc
}
protected Mode Mode
{
get; set;
}
public override void Say()
{
if(this.Mode == Mode.BaseFunctionality)
base.Say();
else
Console.WriteLine("Called from Derived");
}
}
这样,派生类就可以适当地控制其父母的状态。
- 3 回答
- 0 关注
- 491 浏览
添加回答
举报