![](/img/trans.png)
[英]C#, Using self as a parameter for an abstract override method of the base class
[英]Using abstract override and calling the base class
考慮以下 -
void Main()
{
var c = new C();
c.Print();
}
public abstract class A
{
public virtual void Print()
{
Console.WriteLine("I'm in A!");
}
}
public abstract class B : A
{
public abstract override void Print();
}
public class C : B
{
public override void Print()
{
Console.WriteLine("I'm in C!");
base.Print();
}
}
當然,這不會編譯,因為它認為我正在嘗試調用B的抽象打印方法。 我想做的是調用C的print方法,然后讓它調用base的print方法,它將“鏈接”回A的print方法。 我希望輸出是-
I'm in C!
I'm in A!
這樣做有可能嗎? 我究竟做錯了什么?
編輯:我想補充一點,關於上面的代碼的要點是,我試圖強迫任何擴展B的人實現自己的Print方法。
好吧,你可以做
public abstract class A
{
public virtual void Print()
{
Console.WriteLine("I'm in A!");
}
}
public abstract class B : A
{
public override void Print()
{
base.Print();
}
}
public class C : B
{
public override void Print()
{
Console.WriteLine("I'm in C!");
base.Print();
}
}
哪個有效
public abstract class A
{
public virtual void Print()
{
Console.WriteLine("I'm in A!");
}
}
public abstract class B : A
{
}
public class C : B
{
public override void Print()
{
Console.WriteLine("I'm in C!");
base.Print();
}
}
如果刪除從B
覆蓋的嘗試:
public abstract override void Print();
那正是它會做的。
完整代碼:
static void Main(string[] args)
{
var c = new C();
c.Print();
Console.ReadLine();
}
public abstract class A
{
public virtual void Print()
{
Console.WriteLine("I'm in A!");
}
}
public abstract class B : A
{
}
public class C : B
{
public override void Print()
{
Console.WriteLine("I'm in C!");
base.Print();
}
}
結果:
I'm in C!
I'm in A!
您無法強迫類提供其自己的實現,畢竟它只能調用base.Print()
甚至只是提供一個空的方法實現。
對於類似的討論,請參見: 如何在沒有抽象基類的情況下強制在后代中重寫方法?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.