簡體   English   中英

使用抽象覆蓋並調用基類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM