【问题标题】:Inheritance/classes in C#C#中的继承/类
【发布时间】:2012-03-04 15:45:46
【问题描述】:

我是 C# 新手,正在尝试理解类和“是”关系。我一直在尝试让一段代码工作,但我似乎无法正确完成。

看起来像这样:http://pastebin.com/cQDusptB

我有一个基类 Mammal,应该能够创建它的实例,并将哺乳动物的名称作为输入。 我还有一个类,Dog,它是哺乳动物。人们也应该能够以与哺乳动物相同的方式创建此实例。

谁能看到我的缺陷?如果是,你能解释一下我误解/忘记了什么吗?

【问题讨论】:

  • 您可以在问题中包含一个您遇到的问题的小示例。不需要 Pastebin。

标签: c# class inheritance


【解决方案1】:

在发布此类问题时,同时发布编译器给您的错误消息会很有帮助。

谁能看到我的缺陷?

你有一个虚拟构造函数。

你能解释一下我误解/忘记了什么吗?

构造函数在 C# 中不继承,因此将它们标记为 virtualoverride 是没有意义的。

【讨论】:

    【解决方案2】:

    Dog 的构造函数需要命名为“Dog”。您不能/不需要覆盖“哺乳动物”。此外,哺乳动物的构造函数不应该是虚拟的。

    public class Mammal 
    {
    
        public Mammal(string name)
        {
            //....
        }
    }
    
    public class Dog : Mammal {
    
        public Dog(string name) : base(name) 
        {
        }
    }
    

    您使用“base”关键字将参数传递给基类构造函数(参见上面的代码)。

    一定要选择一本关于 C# 的好书,以正确掌握语言基础知识。

    【讨论】:

    • 谢谢。这是有道理的:) - 我有一本书,但我不太明白这部分的解释:(
    【解决方案3】:

    这里有一些问题。一方面,构造函数不能被标记为虚拟的或被覆盖的。另一个问题是您尝试在没有括号的情况下调用方法.Name。修正后的版本如下:

    public class Mammal
    {
        protected string _Name;
    
        public virtual string Name()
        {
                return (this._Name + " - of type " + this.GetType());
        }
        public Mammal(string Name)
        {
            this._Name = Name;
        }
    }
    public class Dog : Mammal
    {
        public Dog(string Name) : base(Name)
        {
        }
    
        public override string Name()
        {
            return (base._Name + "Dog");
        }
    }
    
    static void Main()
    {
        Mammal AnimalA = new Mammal("SubjectA");
        Console.WriteLine("{0}", AnimalA.Name());
    
        Mammal AnimalB = new Dog("SubjectB");
        Console.WriteLine("{0}", AnimalB.Name());
        Console.ReadLine();
    }
    

    【讨论】:

    • 谢谢! - 我理解这些变化! - 我想知道,是否有任何简单的解决方法,如果我只想调用没有 () 的 .Name ?
    • 使用properties
    【解决方案4】:

    构造函数不会被继承/覆盖。

    • 在 Mammal 类的 Mammal 构造函数中丢失了“virtual”关键字。
    • 删除 Dog 类中的 Mammal ctor 覆盖尝试。
    • 将其替换为调用 Mammal 的 Dog 构造函数(如下所示):

    public Dog(string name) : base(name) {

    }

    现在,当狗被构造时,它将调用哺乳动物基类的构造函数,并传递指定的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 2015-12-09
      • 1970-01-01
      相关资源
      最近更新 更多