Обычно, если кто-то указал, что у абстрактного класса есть абстрактный метод, это либо потому, что этот класс зависит от того или иного метода от того или иного метода, либо потому, что он является частью ожидаемого API, что для него не имеет смысла. родительский класс для реализации в это время. В любом случае, должна быть реализацией, как только вы попадете в неабстрактную реализацию класса.
Обратите также внимание, что если вы реализуете интерфейс , вы должны указать, как этот интерфейс будет реализован, даже если вы просто вызываете абстрактное членство и передаете ответственность подклассу
public interface IPet {string GetNoise(); int CountLegs(); void Walk();}
public abstract class Pet : IPet
{
public string Name {get; set;}
public abstract string GetNoise(); // These must be here
public abstract int CountLegs();
public abstract void Walk();
}
Когда дело доходит до реализации подкласса, у вас есть несколько вариантов в зависимости от обстоятельств. Если ваша реализация сама является абстрактным классом, вам не нужно реализовывать абстрактный метод.
public abstract class Quadruped : Pet
{
public override int CountLegs () { return 4; }
}
Если ваша реализация неабстрактная, но стандартная причина для рассматриваемого метода действительно не применима в ваших обстоятельствах, вы можете сделать неоперативный метод (в случае пустых методов) или вернуть несколько фиктивных значение или даже бросить NotImplementedException, чтобы указать, что метод никогда не должен был вызываться в первую очередь.
public class Fish : Pet
{
public override string GetNoise() {return "";} // dummy value: fish don't make noise
public override int CountLegs() {return 0;}
public override void Walk() {} // No-op
// public override void Walk() { throw new NotImplementedException("Fish can't walk"); }
}
Это отвечает на ваш вопрос?