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
。这是推荐的解决方法吗?
答案 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)
如前所述,接口是合同,因此所有接口都需要实施。如果消费者试图调用界面中定义但未在具体类中实现的内容,则应用程序将崩溃。