Я сталкиваюсь с моей наименее любимой проблемой, и это переписывает код. Вот структура, которую я сейчас разработал.Архитектура для интерфейса/абстракции
public interface ICanMove
{
int speed { get; set; }
void Walk();
void Run();
}
public class Worker : ICanMove
{
speed = 5;
public void Walk()
{
//Example code Move(speed);
}
}
public class Warrior : ICanMove
{
speed = 3;
public void Walk()
{
//Example code Move(speed);
}
}
Проблема здесь в нескольких классах использует интерфейс таким же образом. Но они не всегда будут делать то же самое. Есть ли способ реализовать это ... более правильно. Другой вариант у меня есть абстрактный класс, который будет работать для этого примера, но не тогда, когда у меня есть еще несколько интерфейсов (ICanAttack, ICanBuild)
с абстрактным классом
public abstract class LivingCreature : ICanMove
{
public abstract int speed {get;set;}
public void Walk()
{
//Example code Move(speed);
}
public void Run()
{
}
}
Но тогда моя проблема становится у меня есть реализовать несколько интерфейсов на базовый класс, который не каждый объект, который наследует от базового класса будет нуждаться в 100%
Если вы не хотите, чтобы они реализовали его по-другому, тогда вы должны использовать абстрактный класс, как вы упомянули. –
Для дальнейшего расширения моего комментария - интерфейс - это гарантия, что вы можете сделать что-то *, но не гарантию того, как вы это делаете. Абстрактный класс обеспечивает общедоступную функциональность. Вы можете создать абстрактный класс, который реализует интерфейс, а затем наследует от абстрактного класса. –
Если вы создаете абстрактный класс, например «BaseMover», вы можете реализовать абстрактный класс ICanMove, а затем просто получить Worker и Warrior от IBaseMover. Проблема в том, что вы не можете выполнять множественное наследование, поэтому, имея BaseMover, вы также можете наследовать BaseBuilder, который стандартизирует реализацию интерфейса IcanBuild. –