Использование наследования в C # - PullRequest
2 голосов
/ 12 октября 2011

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 12 октября 2011

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

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

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

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

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

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

3 голосов
/ 12 октября 2011

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

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

2 голосов
/ 12 октября 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.";
    }
  }
}
...