簡體   English   中英

我的抽象類實現了一個接口,但沒有實現它的一些方法。 我如何編譯?

[英]My abstract class implements an interface but doesn't implement some of its methods. How do I make it compile?

interface ICanvasTool
{
    void Motion(Point newLocation);
    void Tick();
}

abstract class CanvasTool_BaseDraw : ICanvasTool
{
    protected abstract void PaintAt(Point location);

    public override void Motion(Point newLocation)
    {
        // implementation
    }
}

class CanvasTool_Spray : CanvasTool_BaseDraw
{
    protected abstract void PaintAt(Point location)
    {
        // implementation
    }

    public override void Tick()
    {
        // implementation
    }
}

這不編譯。 我可以添加一個抽象方法“Tick_Implementation”到CanvasTool_BaseDraw,然后實現ICanvasTool.TickCanvasTool_BaseDraw有一個班輪只是調用Tick_Implementation。 這是推薦的解決方法嗎?

這樣做的方法是向CanvasTool_BaseDraw添加一個抽象的void Tick()方法,並在CanvasTool_Spray覆蓋它。

並非每種編程語言都是這樣做的。 在Java中,您不必為您實現的接口中的每個方法添加抽象方法。 在這種情況下,您的代碼將編譯。

你有一些東西混在一起..

Motion應該在您的基類中是虛擬的,以便可以在子類中重寫它。 您的子類需要使用PaintAt覆蓋而不是抽象。 基類需要將Tick作為抽象方法實現。

interface ICanvasTool
{
    void Motion(Point newLocation);
    void Tick();
}

abstract class CanvasTool_BaseDraw : ICanvasTool
{
    protected abstract void PaintAt(Point location);

    public virtual void Motion(Point newLocation)
    {
        // implementation
    }

    public abstract void Tick();
}

class CanvasTool_Spray : CanvasTool_BaseDraw
{
    protected override void PaintAt(Point location)
    {
        // implementation
    }

    public override void Tick()
    {
        // implementation
    }
}

另一種方法是不在基類聲明中列出接口。 每個派生類必須在其聲明中列出ICanvasTool,如果它想要實現接口,那么它只負責實現接口的其余部分。 我可以看到的一個缺點是你不能在基類中顯式實現接口方法(即沒有ICanvasTool:Motion),但是否則這是一個相當低的開銷版本。

public interface ICanvasTool
{
    void Motion(Point newLocation);
    void Tick();
}

public abstract class CanvasTool_BaseDraw
{
    public void Motion(Point newLocation)
    {
        //some implementation
    }
}

public class CanvasTool_Spray : CanvasTool_BaseDraw, ICanvasTool
{
    public void Tick()
    {
        //some implementation
    }
}

注意:我遺漏了PaintAt,因為這個例子沒有必要。

如前所述,接口是合同,因此所有接口都需要實現。 如果消費者試圖調用界面中定義但未在具體類中實現的內容,則應用程序將崩潰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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