【发布时间】:2013-08-08 14:34:51
【问题描述】:
我在这里有一个名为IFish 的接口。我想用提供不完整实现的抽象类 (WalkingFishCommon) 派生它,因此从WalkingFishCommon 派生的类不必实现CanWalk 属性:
interface IFish
{
bool Swim();
bool CanWalk { get; }
}
abstract class WalkingFishCommon : IFish
{
bool IFish.CanWalk { get { return true; } }
// (1) Error: must declare a body, because it is not marked
// abstract, extern, or partial
// bool IFish.Swim();
// (2) Error: the modifier 'abstract' is not valid for this item
// abstract bool IFish.Swim();
// (3): If no declaration is provided, compiler says
// "WalkingFishCommon does not implement member IFish.Swim()"
// {no declaration}
// (4) Error: the modifier 'virtual' is not valid for this item
// virtual bool IFish.Swim();
// (5) Compiles, but fails to force derived class to implement Swim()
bool IFish.Swim() { return true; }
}
我还没有发现如何让编译器满意,同时仍然实现强制从WalkingFishCommon 派生的类实现Swim() 方法的目标。特别令人费解的是 (1) 和 (2) 之间的增量,编译器在抱怨 Swim() 没有标记为抽象之间交替,然后在下一次呼吸中抱怨它不能标记为抽象。有趣的错误!
有什么帮助吗?
【问题讨论】:
-
您可以在 IFish.Swim 中抛出 NotImplementedException,即使它并不是您真正想要的
-
你必须实现所有的接口。你可以声明一个空方法而不使用它..
-
好的,如果这只是语言语义的限制,我可以忍受。也许我误读了似乎表明这是可能的消息来源......
-
public abstract bool Swim();可以工作,但您似乎希望显式实现接口... -
@Stabledog:您正在显式实现接口(没有
public方法,而是IFish.前缀)。这意味着不能在这些鱼的实例上调用它们除非您首先将该实例转换为IFish。如果您没有显式实现,那么您可以在任何实现该接口的类型上调用该方法。见stackoverflow.com/questions/143405/…
标签: c# abstract-class