Ich habe hier eine Schnittstelle namens IFish
. Ich will es mit einer abstrakten Klasse abzuleiten (WalkingFishCommon
), die eine unvollständige Umsetzung bereitstellt, so dass abgeleitete Klassen von WalkingFishCommon
nicht die CanWalk
Eigenschaft implementieren müssen:Wie erfülle ich den Compiler, wenn ich nur teilweise eine Schnittstelle mit einer abstrakten Klasse implementiere?
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; }
}
Ich habe noch nicht herausgefunden, wie das zu machen Compiler glücklich, während immer noch das Ziel erreicht, von WalkingFishCommon abgeleitete Klassen zu zwingen, die Swim()
Methode zu implementieren. Besonders verwirrend ist das Delta zwischen (1) und (2), wo der Compiler abwechselnd beschwert, dass Swim()
nicht als abstrakt markiert ist und im nächsten Atemzug beklagt, dass es nicht abstrakt markiert werden kann. Interessanter Fehler!
Irgendwelche Hilfe?
Sie könnten eine NotImplementedException in IFish.Swim werfen, obwohl es nicht wirklich das ist, was Sie suchen – BlackBear
Sie müssen die gesamte Schnittstelle implementieren. Sie können eine leere Methode deklarieren und einfach nicht verwenden. – Botonomous
Ok, nun, wenn es nur eine Einschränkung der Sprachsemantik ist, kann ich damit leben. Vielleicht habe ich die Quellen falsch gelesen, die darauf hindeuten, dass dies möglich war ... – Stabledog