Сопряжение производного класса два на два надлежащим образом - PullRequest
0 голосов
/ 08 мая 2018

Принимая эти классы:

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], но мне не очень нравится это решение. Я также думал об Атрибутах, но я не знаю, может ли он справиться с работой или как правильно их использовать.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Ну, я, наконец, выбрал это решение, но я не знаю о его приемлемости:

public enum Race
{
    Human = 0x01,
    Dwarf = 0x02,
    ...

    Mutant = 0x80,

    Superhuman = Mutant | Human,
    DwarfOnADonkey = Mutant | Dwarf,
    ...
}

public abstract Creature
{
    public abstract Race Race { get; }
    ...
}

public abstract NormalCreature : Creature { ... }
public abstract MutantCreature : Creature { ... }

public sealed Human : NormalCreature
{
    public override Race Race { get Race.Human; }
    ...
}
public sealed Superhuman : MutantCreature
{
    public override Race Race { get Race.Superhuman; }
    ...
}
0 голосов
/ 08 мая 2018

С наследованием всегда думай «это».Сверхчеловек - это человек, поэтому Superhuman должно происходить от Human.
Но человек принадлежит к расе, а не человек - это раса.Это означает, что Human не может быть производным от Race.Вы можете использовать термин «существо» в качестве базового класса для человека и гнома.

Я бы не использовал иерархию классов для сохранения истории объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...