Использование наследования в C #

Так что у меня только что было собеседование, и они дали мне список задач, над которыми они хотели, чтобы я работал заранее. Я выполнил все задания, кроме одного, и мне было интересно, сможет ли кто-нибудь пролить свет на этот вопрос.

Вопрос был примерно таким

  1. Создайте класс с именем Human, дайте ему общедоступное свойство HairColor и открытый метод Talk (), который при вызове возвращает «Я человек».
  2. Создайте еще один класс с именем child, который наследуется от Human, переопределяет метод talk и возвращает «Я ребенок».
  3. Создайте мужской и женский классы, которые переопределяют разговор и выводят «Я мужчина». и «Я женщина».
  4. Измените иерархию детей и людей, чтобы включить в них мужчин и женщин, и выведите правильную строку.

Я выполнил задачи 1–3, но был озадачен вопросом 4. В моем прошлом опыте работы с наследованием я мало что сделал, и вопрос показался мне довольно расплывчатым. Я объяснил это работодателю, и они, похоже, согласились с этим, но не сказали мне, как это должно было быть сделано. Меня это беспокоит, и мне интересно, как это делается.


person jsmith    schedule 12.10.2011    source источник
comment
Я действительно не думаю, что ребенок - это тип человека, это скорее состояние (то есть атрибут).   -  person Blindy    schedule 12.10.2011
comment
Я считаю, что возраст и пол являются атрибутами человека и им не место в иерархии наследования.   -  person ChaosPandion    schedule 12.10.2011
comment
Полагаю, они хотели, чтобы вы изменили его на: Человек - ›Ребенок -› Мужской / Женский? Я с тобой, это довольно расплывчато.   -  person CodingGorilla    schedule 12.10.2011
comment
@Blindy Это действительно выбор дизайна. Однако я согласен с тем, что этот вопрос слишком расплывчатый.   -  person MGZero    schedule 12.10.2011
comment
Похоже, HR пошел в Интернет и заплатил за вопросы на собеседовании. То же самое произошло на последнем месте, где я работал.   -  person Josh    schedule 12.10.2011
comment
@MGZero - И вообще, что такое ребенок? Это вопрос возраста, зрелости или интеллекта? Считается ли психически неполноценный человек в возрасте 30 лет взрослым или ребенком? Подобные вопросы не должны омрачать дизайн программы.   -  person ChaosPandion    schedule 12.10.2011
comment
Я бы переосмыслил работу в этой компании.   -  person Chris Marasti-Georg    schedule 12.10.2011
comment
@Commenters, я сомневаюсь, что это упражнение предназначалось для реального использования, но это просто пример, чтобы увидеть, понимает ли кандидат концепцию наследования. Я не думаю, что это вообще что-то говорит о компании или об интервьюерах в частности.   -  person Anthony Pegram    schedule 12.10.2011
comment
@Anthony Pegram - Я знаю, но такой надуманный пример меня действительно раздражает. Я просто представляю, как начинающий разработчик думает, что программы должны разрабатываться таким образом.   -  person ChaosPandion    schedule 12.10.2011
comment
@ChaosPandion Я считаю это вопросом возраста. Вы не согласны с тем, что наследование - это совершенно правильный способ представления этих отношений? Имейте в виду, я не говорил, что это ЛУЧШИЙ путь, я думаю, что это лучший путь Блинди. Очевидно, однако, что этот вопрос сфальсифицирован, чтобы проверить ваше понимание наследования, и его не следует воспринимать как серьезную проблему проектирования в реальном мире.   -  person MGZero    schedule 12.10.2011
comment
Я думаю, что вопрос интервью был расплывчатым намеренно, и они хотят попытаться увидеть, как кто-то его решит. А может, как вести себя в непонятных условиях. Просто измените правила и скажите им, почему пол и возраст не должны иметь значения для цепочки наследования, это атрибуты, и вы бы так их спроектировали. Конечно, для этого нужна уверенность :) Это показывает, что вы используете свою голову и не следуете слепо глупым ограничениям.   -  person dowhilefor    schedule 12.10.2011


Ответы (3)


Просто чтобы вписаться в их мир и желаемую иерархию классов, которая не особо указывает на то, как вы могли бы относиться к человеку в реальном приложении, у вас может быть

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, поскольку эти дескрипторы вряд ли уникальны для людей.

person Community    schedule 12.10.2011

Похоже, они хотят, чтобы вы продемонстрировали, что вы понимаете ограничения простого наследования в этом упражнении. Вы не можете смоделировать людей, у которых и возраст, и пол представлены наследниками в самой простой модели наследования. Учтите следующее:

  • Abstract Class Human наследуется как Child, так и Adult;
  • Abstract Class Human унаследовано Male и Female

Становится очевидным, что в этой модели человек не может быть одновременно Child и Female - или любой другой комбинацией. Следовательно, ответ заключается в том, что эта простая модель неадекватна, и вместо этого вам следует предложить альтернативные реализации, которые удовлетворяют требованиям, используя установленную модель как можно лучше.

Я повторю то, что часто говорил:

Объекты не должны пытаться представлять реальность. Хорошая объектная модель требует только решения поставленной задачи.

Я имею в виду, что отношения Child/Adult и Male/Female исключительности должны моделироваться наиболее подходящим способом, который решает текущую проблему. Неважно, если они не соответствуют действительности. На вашем месте я бы попытался предложить множество альтернатив, которые подошли бы к разным задачам, и объяснить, почему каждый из них полезен в данной ситуации.

person Tom W    schedule 12.10.2011

Я не часто делаю такие вещи, но, возможно, это сработает:

(По крайней мере, это дает нам код для начала)

class Human {
  public enum SexType { Unknown, Male, Female };
  public Human() {
    HairColor = Color.Brown;
    Sex = SexType.Unknown;
  }
  public bool IsAdam { get { return true; } }
  public Color HairColor { get; set; }
  public SexType Sex { get; set; }
  public virtual string Talk() {
    switch (Sex) {
      case SexType.Male:
        return "I am a Male.";
      case SexType.Female:
        return "I am a Female.";
      default:
        return "I am a human.";
    }
  }
}

class Male : Human {
  public Male() {
    Sex = SexType.Male;
  }
}

class Female : Human {
  public Female() {
    Sex = SexType.Female;
  }
}

class Child : Human {
  public Child() {
  }
  public override string Talk() {
    switch (Sex) {
     case SexType.Male:
       return "I am a boy.";
     case SexType.Female:
       return "I am a girl.";
     default:
       return "I am a child.";
    }
  }
}
person jp2code    schedule 12.10.2011