C# 自动调用基方法
我需要在调用重写的方法时自动调用基类方法(就像构造函数调用base一样)。例如:C# 自动调用基方法,c#,inheritance,C#,Inheritance,我需要在调用重写的方法时自动调用基类方法(就像构造函数调用base一样)。例如: class A { public void Fun() { Console.Write("Class A!"); } } class B : A { public void Fun() { Console.Write("Class B!"); } } 我想在屏幕上看到 甲级!B班 执行下一个代码时: B b = new B(); b
class A
{
public void Fun()
{
Console.Write("Class A!");
}
}
class B : A
{
public void Fun()
{
Console.Write("Class B!");
}
}
我想在屏幕上看到
甲级!B班
执行下一个代码时:
B b = new B();
b.Fun();
谁能告诉我示例代码中需要更改什么,或者如何更好地编写以获得所需的结果?谢谢。如果您想要这种行为,您需要更改平台/语言。NET不会自动调用基方法。您需要显式地调用它。此外,您的方法需要是或将隐藏在派生类中:
class A
{
public virtual void Fun()
{
Console.Write("Class A!");
}
}
class B : A
{
public override void Fun()
{
// call the base method which will print Class A!
base.Fun();
Console.Write("Class B!");
}
}
现在,当您执行此操作时:
B b = new B();
b.Fun();
您将获得所需的结果。如果您不想显式调用它,因此确保在派生类中调用了
A.Fun()
,则可以使用名为:
这将给你:
new A().Fun() -> "Class A!"
new B().Fun() -> "Class A! Class B!"
仍然可以这样:
interface IFun
{
void Fun();
}
abstract class A : IFun
{
void IFun.Fun()
{
Console.Write("Class A!");
Fun();
}
protected abstract void Fun();
}
class B : A
{
protected override void Fun()
{
Console.Write("Class B!");
}
}
IFun b = new B();
b.Fun();
如果对象引用是IFun,这就可以工作。仅作为参考,您可以使用一个包装器模式,将a放入B中。下面是一个粗略的示例
没有理由这么复杂。只需显式调用父类的方法:
class A {
public void Fun() {
Console.Write("Class A!");
}
}
class B : A {
public void Fun() {
base.Fun();
Console.Write("Class B!");
}
}
class Program {
static void Main(string[] args) {
(new B()).Fun();
}
}
“您的方法还需要是虚拟的,或者您将在派生类中隐藏它”对于poster想要的行为,我不确定它是否需要是虚拟的。@strager,如果它不是虚拟的,您将得到一个编译器警告。您可以在不使用虚拟方法的情况下使用new关键字来消除警告。@BurningIce,正确,这可能是你应该做的@Darin Dimitrov,期望的行为和虚拟方法是正交的;虚拟方法与此问题无关。@Kirkham感谢您纠正我的拼写并澄清我的答案:),但我不能以这种方式创建类的实例。而且已经给出了很好的答案。它与我在问题的第一句中提出的问题正好相反。请通过编辑对您的答案添加一些解释,以便其他人可以从中学习
interface IFunClass {
void Fun();
}
class A : IFunClass {
public void IFunClass.Fun() {
Console.Write("Class A!");
}
}
class B : IFunClass {
public B(IFunClass f) {
this.m_SomethingFun = f;
}
public void IFunClass.Fun() {
this.m_SomethingFun.Fun();
Console.Write("Class B!");
}
private IFunClass m_SomethingFun;
}
A a = new A();
B b = new B(a);
b.Fun() // will call a.Fun() first inside b.Fun()
class A {
public void Fun() {
Console.Write("Class A!");
}
}
class B : A {
public void Fun() {
base.Fun();
Console.Write("Class B!");
}
}
class Program {
static void Main(string[] args) {
(new B()).Fun();
}
}