Просто для того, чтобы вписаться в их мир и желаемую иерархию классов, что не особенно указывает на то, как вы можете относиться к человеку в реальном приложении, у вас может быть
class Human
{
public string HairColor { get; set; }
public virtual void Talk()
{
Console.WriteLine("I am a human");
}
}
class Female : Human
{
public override void Talk()
{
Console.WriteLine("I am a woman");
}
}
class Male : Human
{
public override void Talk()
{
Console.WriteLine("I am a man");
}
}
class Boy : Male
{
public override void Talk()
{
Console.WriteLine("I am a boy");
}
}
class Girl : Female
{
public override void Talk()
{
Console.WriteLine("I am a girl");
}
}
Это выражает иерархию наследования, что мальчик - это мужчина, а человек - это женщина, а человек - это человек. Таким образом, вы можете написать любое из следующих утверждений
Human human = new Human();
Human human = new Female();
Human human = new Girl();
Female female = new Female();
Female female = new Girl();
Girl girl = new Girl();
И везде, где требуется Human
, может быть передано Female
или Girl
.
Такие вещи как не будут действительными
Girl girl = new Human();
Girl girl = new Female();
Female female = new Human();
Female female = new Male();
Female female = new Boy();
И, естественно, нигде, ожидая, что Girl
не может быть передан Human
или Female
, и, конечно, не Male
или Boy
.
В реальном мире, как заявили комментаторы, вы обычно не используете наследование в этом сценарии, а вместо этого используете свойства для дифференциации по возрасту или полу. И, в этом отношении. При использовании фактического наследования вы, вероятно, не захотите использовать Male
или Female
, так как эти дескрипторы вряд ли уникальны для людей.