Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中使用继承#_C#_.net_Inheritance_Hierarchy - Fatal编程技术网

C# 在C语言中使用继承#

C# 在C语言中使用继承#,c#,.net,inheritance,hierarchy,C#,.net,Inheritance,Hierarchy,所以我刚参加了一次工作面试,他们给了我一份他们希望我事先完成的任务清单。除了一项任务外,我完成了所有的任务,我想知道是否有人能解释一下这个问题 问题是这样的 创建一个名为Human的类,为该类提供一个公共属性hairolor和一个公共方法Talk(),调用该类时,返回“我是人” 创建另一个名为child的类,该类继承自Human并重写talk方法并返回“I am a child” 创建一个男性和女性类,覆盖talk并输出“我是男性”和“我是女性” 更改子层次结构和人员层次结构以适当地包括男性和女

所以我刚参加了一次工作面试,他们给了我一份他们希望我事先完成的任务清单。除了一项任务外,我完成了所有的任务,我想知道是否有人能解释一下这个问题

问题是这样的

  • 创建一个名为Human的类,为该类提供一个公共属性hairolor和一个公共方法Talk(),调用该类时,返回“我是人”
  • 创建另一个名为child的类,该类继承自Human并重写talk方法并返回“I am a child”
  • 创建一个男性和女性类,覆盖talk并输出“我是男性”和“我是女性”
  • 更改子层次结构和人员层次结构以适当地包括男性和女性,并输出适当的字符串

  • 我完成了任务1-3,但被问题4难住了。在我过去的继承工作经验中,我没有做太多工作,这个问题对我来说似乎有点模糊。我向雇主解释了这一点,他们似乎同意,但没有告诉我应该怎么做。它现在一直在困扰着我,我想知道它是如何做到的。

    只是为了适应他们的世界和所需的类层次结构,这并不是特别表明你可能在实际应用程序中如何对待一个人,你可能已经做到了

    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();
    
    任何带着
    人的地方都可以传给
    女性
    女孩

    这样的事情是无效的

    Girl girl = new Human();
    Girl girl = new Female();
    Female female = new Human();
    Female female = new Male();
    Female female = new Boy();
    
    当然,任何一个期待着女孩的地方都不能被传给人类或女性,当然也不能传给男性或男孩


    在现实世界中,正如评论者所说,在这种情况下,您通常不会使用继承,而是使用属性根据年龄或性别进行区分。就这点而言。如果使用实际继承,您可能不会选择使用
    男性
    女性
    ,因为这些描述符几乎不是人类独有的

    我不经常做这类事情,但也许这会奏效:

    (如果没有其他内容,它将为我们提供一个代码库)


    听起来好像他们想让你在这个练习中证明你理解简单继承的局限性。在最简单的遗传模型中,你不能用继承人代表的年龄和性别来模拟人类。考虑以下事项:

    • 抽象类人类
      儿童
      成人
      继承
    • 抽象类人类
      男性
      女性继承
    很明显,在这个模型中,人类不能既是
    儿童
    又是
    女性
    ——或者是任何其他组合。因此,答案是这个简单的模型是不够的,相反,您应该建议满足需求的替代实现,同时尽可能使用已建立的模型

    我将重复我经常说的话:

    对象不应试图表示现实。一个好的对象模型只需要解决手头的问题


    我的意思是,应该以最合适的方式对
    儿童/成人
    男性/女性
    排他性关系进行建模,以解决眼前的问题。如果他们不能代表现实,那也没关系。在你的位置上,我会尝试提出各种各样的备选方案,以适应不同的问题,并解释为什么在这种情况下每种方案都是有益的。

    我真的不认为“儿童”是一种人类,它更多的是一种状态(即属性).我认为年龄和性别是人类的属性,在继承层次中没有位置。我猜他们想让你把它改为:人类->儿童->男性/女性?“我同意你的观点,这是相当模糊的。”评论者们,我怀疑这个练习是用于现实世界的,但只是作为一个例子,看看候选人是否理解继承的概念。我认为这根本没有说明公司或面试官的具体情况。我认为面试问题故意含糊其辞,他们想看看有人会如何解决这个问题。或者在不清楚的情况下如何表现。只要改变规则,告诉他们为什么性别和年龄对继承链不重要,这些都是属性,你可以这样设计。当然,这需要一些信心:)它表明你运用你的头脑,不要盲目地遵循愚蠢的约束。
    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.";
        }
      }
    }