Вот обзор структуры классов в моем проекте:
Код: Выделить всё
interface IInputProcessor
{
public ProcessInputsResult ProcessInputs(Item[] inputs);
}
abstract class MachineComponent : IInputProcessor
{
public abstract ProcessInputsResult ProcessInputs(Item[] inputs);
}
interface IComponentContainer where T : MachineComponent
{
public T[] Components { get; }
}
class MachineSystem : MachineComponent, IComponentContainer
{
public MachineComponent[] Components { get; }
}
Чтобы добиться этого, я попытался создать реализацию метода по умолчанию для ProcessInputs внутри IComponentContainer, например:< /p>
Код: Выделить всё
interface IComponentContainer : IInputProcessor where T : MachineComponent
{
public T[] Components { get; }
ProcessInputsResult IInputProcessor.ProcessInputs(Item[] inputs)
{
...
}
}
Я надеялся, что это новое определение будет означать, что MachineSystem, которая является одновременно MachineComponent и IComponentContainer, не нужно будет указывать реализацию для MachineComponent.ProcessInputs , поскольку это указано в интерфейсе IComponentContainer.
Это было не так, и мне пришлось явно сослаться на метод к реализации, указанной в интерфейсе. вот так:
Код: Выделить всё
class MachineSystem : MachineComponent, IComponentContainer
{
...
public override ProcessInputsResult ProcessInputs(Item[] inputs) =>
((IComponentContainer)this).ProcessInputs(inputs);
}
Это есть хорошее решение этой проблемы, или мне следует изменить структуру кода?
ОБНОВЛЕНИЕ: В ответ на ответ Ивана Петрова
Код: Выделить всё
interface IComponentContainer : IInputProcessor where T : MachineComponent {
public T[] Components { get; }
}
class ComponentContainer : MachineComponent, IComponentContainer
where T : MachineComponent {
public T[] Components { get; }
public override ProcessInputsResult ProcessInputs(Item[] inputs) {
// implementation will serve for interface method too
}
}
class MachineSystem : ComponentContainer {
// we can still override ProcessInputsResult here too
}
Код: Выделить всё
class ComponentContainer : TBase, IComponentContainer
where TContainer : MachineComponent
where TBase : MachineComponent
{
public T[] Components { get; }
public override ProcessInputsResult ProcessInputs(Item[] inputs)
{
...
}
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... -interface
Мобильная версия