Вы пытаетесь реализовать наследование алмазов с помощью интерфейсов.Главная причина, по которой вам не разрешено реализовывать несколько классов, это во-первых, чтобы избежать наследования алмазов.
Если вы хотите объединить два интерфейса вместе как ComplexAction
, вы должны сделать что-то вроде следующего:
interface IAct
{
bool CanAct();
}
class Act1 : IAct
{
public bool CanAct()
{
return true;
}
}
class Act2 : IAct
{
public bool CanAct()
{
return false;
}
}
class ComplexAction : IAct
{
private Act1 action1;
private Act2 action2;
public ComplexAction(Act1 action1, Act2 action2)
{
this.action1 = action1;
this.action2 = action2;
}
public bool CanAct()
{
return action1.CanAct() && action2.CanAct();
}
}
A ComplexAction
- это композиция разных IAct
с.Если вы добавляете число к имени интерфейса, высока вероятность того, что вы делаете что-то не так.
Если вместо этого вы хотите определить другое поведение на основе интерфейса, этот интерфейс должен иметь свой метод, определенныйна себя.
interface IAct1
{
bool CanAct();
}
interface IAct2
{
bool CanAct();
}
class SometimesAct1SometimesAct2 : IAct, IAct1, IAct2
{
bool IAct1.CanAct()
{
return false;
}
bool IAct2.CanAct()
{
return true;
}
public bool CanAct()
{
Console.WriteLine("Called on IAct or SometimesAct1SometimesAct2");
return false;
}
}
Чтобы избежать проблем наследования алмазов, вы должны предоставить реализацию для ВСЕХ интерфейсов, которые определяют конкретный метод, поэтому нет никакой двусмысленности.