C# 非常基本的虚函数练习

C# 非常基本的虚函数练习,c#,C#,好的,下面是练习: 必须定义三个类。一个名为MyNum的类包含int类型的变量。第二个名为MyString的类将从MyNum派生并包含string。第三个类调用MyType并返回MyNum类型的变量。每个类将被设置为一个构造函数和一个名为Show的虚拟函数。MyType的构造函数函数接收一个MyNum变量,而MyType的函数Show将运行MyNum的Show函数。 现在,您需要设置两个MyType类型的对象并初始化它们。一次是MyNum类型的对象,一次是MyString类型的对象 代码如下:

好的,下面是练习: 必须定义三个类。一个名为MyNum的类包含int类型的变量。第二个名为MyString的类将从MyNum派生并包含string。第三个类调用MyType并返回MyNum类型的变量。每个类将被设置为一个构造函数和一个名为Show的虚拟函数。MyType的构造函数函数接收一个MyNum变量,而MyType的函数Show将运行MyNum的Show函数。 现在,您需要设置两个MyType类型的对象并初始化它们。一次是MyNum类型的对象,一次是MyString类型的对象

代码如下:

class MyNum
{
    protected int num;
    public MyNum(int num)
    {
        this.num = num;
    }
    public virtual void Show()
    {
        Console.WriteLine("The number is : " + num);
    }
}
class MyString : MyNum
{
    string str;
    public MyString(string str)
    {
        this.str= str;
    }
}
class MyType : MyNum
{
    MyNum num2;
    public MyType(MyNum num)
    {
        this.num2 = num;
    }
    public override void Show()
    {
        base.Show();
    }
}
class Program
{
    static void Main(string[] args)
    {

    }
}
我有以下错误:

错误1“ConsoleApplication1.MyNum”不包含采用“0”参数的构造函数C:\Users\x\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs 23 16 ConsoleApplication1


有人知道我为什么会犯这个错误吗?谢谢。

MyString隐式具有零参数构造函数,因为您没有在该类中指定任何构造函数。您可以在超类中声明零参数构造函数,也可以在MyString中声明单参数构造函数。

MyString隐式地具有零参数构造函数,因为您没有在该类中指定任何构造函数。您可以在super类中声明一个零参数构造函数,也可以在MyString中声明一个单参数构造函数。

因为您的类是MyNum的子类,所以它需要能够构造它。您没有默认构造函数,因此必须使用值显式调用它

例如:

             // Since this is here, you're saying "MyType is a MyNum"
class MyType : MyNum
{
    MyNum num2;
    public MyType(MyNum num) // You need to call the base class constructor 
                             // here to construct that portion of yourself
       : base(42) // Call this with an int...
    {
        this.num2 = num;
    }
MyString
将需要类似的处理。它还必须有一个调用基类构造函数的构造函数

请注意,如果
MyNum
类有一个默认构造函数(可以是
受保护的
),这并不重要。与调用这些构造函数不同,另一种方法是执行以下操作:

class MyNum
{
    public MyNum(int num)
    {
        this.num = num;
    }

    // Add a default constructor that gets used by the subclasses:
    protected MyNum()
        : this(42)
    {
    }

根据评论进行编辑:

如果要重写基类构造函数,请尝试:

class MyType : MyNum
{
    public MyType(int num)
       : base(num)
    {
    }

    public override void Show()
    {
          Console.WriteLine("The number [MyType] is : " + this.num);
    }
}

由于您的类是MyNum的子类,因此需要能够构造它。您没有默认构造函数,因此必须使用值显式调用它

例如:

             // Since this is here, you're saying "MyType is a MyNum"
class MyType : MyNum
{
    MyNum num2;
    public MyType(MyNum num) // You need to call the base class constructor 
                             // here to construct that portion of yourself
       : base(42) // Call this with an int...
    {
        this.num2 = num;
    }
MyString
将需要类似的处理。它还必须有一个调用基类构造函数的构造函数

请注意,如果
MyNum
类有一个默认构造函数(可以是
受保护的
),这并不重要。与调用这些构造函数不同,另一种方法是执行以下操作:

class MyNum
{
    public MyNum(int num)
    {
        this.num = num;
    }

    // Add a default constructor that gets used by the subclasses:
    protected MyNum()
        : this(42)
    {
    }

根据评论进行编辑:

如果要重写基类构造函数,请尝试:

class MyType : MyNum
{
    public MyType(int num)
       : base(num)
    {
    }

    public override void Show()
    {
          Console.WriteLine("The number [MyType] is : " + this.num);
    }
}

MyString没有构造函数,因此它将使用基类MyNum中的构造函数,该基类没有不带参数的默认构造函数


MyString需要一个构造函数,或者在基类中需要一个无参数的构造函数。

MyString没有构造函数,因此它将使用基类MyNum中的构造函数,而基类MyNum没有没有无参数的默认构造函数



MyString需要一个构造函数,或者在基类中需要一个无参数的构造函数。

问题在于
MyNum
,而不是
MyString
,他还需要在
MyType
中处理这个问题,因为构造函数参数的类型不同……伙计们,我已经编辑了它,我仍然有这个错误,关于MyString类和MyType@Ken:否,问题是
MyString
MyType
子类
MyNum
,但操作不当。错误消息指的是
MyNum
,但是
MyNum
目前还可以。@Reed:对不起。我想说的是,默认情况下,子类的构造函数调用无参数父类的构造函数。无论哪种方式,正确的答案都应该提到隐式构造函数链接,因为这是问题的另一半。问题在于
MyNum
,而不是
MyString
,他还需要在
MyType
中处理这个问题,因为构造函数参数属于不同的类型…伙计们,我编辑了它,我仍然有这个错误,关于MyString类和MyType@Ken:否,问题是
MyString
MyType
子类
MyNum
,但操作不当。错误消息指的是
MyNum
,但是
MyNum
目前还可以。@Reed:对不起。我想说的是,默认情况下,子类的构造函数调用无参数父类的构造函数。不管怎样,正确的答案应该提到隐式构造函数链接,因为这是问题的另一半。伙计们,我已经编辑了它。我仍然有这个错误,在MyString类和MyType上。他还需要在
MyType
中处理这个问题,因为构造函数参数是不同类型的…伙计们,我已经编辑了它,我仍然有这个错误,在MyString类和MyType上,他还需要在
MyType
中处理这个错误,因为构造函数参数是不同的类型…哦,我需要为派生类创建特殊的构造函数?@Rich:派生类需要调用基类的相应构造函数。因为没有默认构造函数(不带参数的构造函数),所以必须显式调用构造函数并传递一个值。@Rich:Correct。C#类不继承构造函数。您必须在每个子类型上定义构造函数。@Rich:阅读以下内容:特别是搜索“base关键字”,并查看下面的部分。@Rich:当您对对象进行子类化时,您会说“MyString是一个MyNum”。但是,您也说过,如果不提供值,就不可能生成“MyNum”。这意味着,隐式地说,不可能在没有某些值的情况下生成MyString-MyString的构造函数必须首先构造MyNum“自身的一部分”-这需要num