Мой абстрактный класс реализует интерфейс, но не реализует некоторые его методы. Как мне сделать это скомпилировать? - PullRequest
3 голосов
/ 13 апреля 2010
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.Tick в CanvasTool_BaseDraw с помощью одной строки, которая просто вызывает Tick_Implementation. Это рекомендуемое решение?

Ответы [ 4 ]

6 голосов
/ 13 апреля 2010

Способ сделать это - добавить абстрактный void Tick() метод к CanvasTool_BaseDraw и переопределить его в CanvasTool_Spray.

Не каждый язык программирования делает это таким образом. В Java вам не нужно добавлять абстрактный метод для каждого метода в интерфейсе, который вы реализуете. В этом случае ваш код будет скомпилирован.

4 голосов
/ 13 апреля 2010

Вы перепутали несколько вещей ..

Движение должно быть виртуальным в базовом классе, чтобы оно могло быть переопределено в дочерних классах.Ваш дочерний класс должен сделать переопределение 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
    }
}
1 голос
/ 14 августа 2012

Альтернатива - не указывать интерфейс в объявлении базовых классов. Каждый производный класс должен перечислить 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, потому что в этом не было необходимости.

0 голосов
/ 13 апреля 2010

Как было сказано ранее, интерфейс - это контракт, и поэтому все это необходимо реализовать. Если потребитель попытается вызвать что-то, что определено в интерфейсе, но не реализовано в конкретном классе, приложение будет аварийно завершено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...