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