【发布时间】:2011-02-07 10:31:09
【问题描述】:
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,然后在 CanvasTool_BaseDraw 中使用仅调用 Tick_Implementation 的单行代码实现 ICanvasTool.Tick。这是推荐的解决方法吗?
【问题讨论】:
-
当您使用界面时,我不确定您所说的“解决方法”是什么意思。接口是一个契约,因此任何实现该接口的类型都必须遵守该契约。编译器的这种强制执行是为了让你的类的调用者可以知道任何实现 ICanvasTool 的类型都有这两个方法。
-
是的,我希望编译器强制接口的任何非抽象后代实现所有它。我只是不希望 abstract 的后代出现这种情况。
-
顺便说一句,Java 是按照我的方式来做的。见stackoverflow.com/questions/197893
标签: c# oop interface abstract-class