Принимая эти классы:
public abstract class Creature
{ public abstract int MaxLevel { get; } }
public abstract class NormalCreature : Creature
{
public abstract Type Mutation { get; }
public override int MaxLevel { get { return 50; } }
}
public abstract class MutantCreature : Creature
{
public abstract Type Base { get; }
public override int MaxLevel { get { return 70; } }
}
public sealed class Human : NormalCreature
{
public override Type Mutation { get { return typeof(Superhuman); } }
...
}
public sealed class Superhuman : MutantCreature
{
public override Type Base { get { return typeof(Human); } }
...
}
public sealed class Dwarf : NormalCreature
{
public override Type Mutation { get { return typeof(DwarfOnADonkey); } }
public void SwimLikeADolphin() { ... }
...
}
public sealed class DwarfOnADonkey : MutantCreature
{
public override Type Base { get { return typeof(Dwarf); } }
// can no longer SwinLikeADolphin(), this is why DwarfOnADonkey does not heritate Dwarf
public void JumpOverTwentyFeet() { ... }
...
}
...
Как я мог добиться этого, получая соединение от каждого NormalCreature
до MutantCreature
, и наоборот, без дублирующего кода ? (если Human
мутирует в Superhuman
, то я мог бы знать, что Superhuman
- это мутация Human
, без указания ее)
Я также думал о другом классе, связывая их с кортежем или массивом [2], но мне не очень нравится это решение.
Я также думал об Атрибутах, но я не знаю, может ли он справиться с работой или как правильно их использовать.