我的抽象类实现了一个接口,但没有实现它的一些方法。我如何编译?

时间:2010-04-13 12:31:12

标签: c# oop interface abstract-class

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
    }
}

这不会编译。我可以向CanvasTool_BaseDraw添加一个抽象方法“Tick_Implementation”,然后在ICanvasTool.Tick中使用只调用Tick_Implementation的一行实现CanvasTool_BaseDraw 。这是推荐的解决方法吗?

4 个答案:

答案 0 :(得分:6)

执行此操作的方法是向void Tick()添加抽象的CanvasTool_BaseDraw方法,并在CanvasTool_Spray中覆盖它。

并非每种编程语言都是这样做的。在Java中,您不必为您实现的接口中的每个方法添加抽象方法。在这种情况下,您的代码将被编译。

答案 1 :(得分:4)

你有一些事情混淆了......

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
    }
}

答案 2 :(得分:1)

另一种方法是不在基类声明中列出接口。每个派生类必须在其声明中列出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,因为这个例子没有必要。

答案 3 :(得分:0)

如前所述,接口是合同,因此所有接口都需要实施。如果消费者试图调用界面中定义但未在具体类中实现的内容,则应用程序将崩溃。