虚拟功能中非常基本的练习

时间:2011-06-29 23:12:46

标签: c#

好的,所以这是练习: 您必须定义三个类。一个名为MyNum的类,它包含int类型的变量。第二个类叫做MyString,将派生自MyNum并包含字符串。第三类调用MyType并返回MyNum类型的变量。每个类都将设置为构造函数和名为Show的虚函数。 MyType的构造函数接收MyNum变量,而Show of MyType函数将运行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

任何人都知道我为什么会遇到这个错误?感谢。

3 个答案:

答案 0 :(得分:8)

由于您的类是子类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类具有默认构造函数(可能是protected),则无关紧要。而不是调用这些构造函数,另一种选择是做类似的事情:

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);
    }
}

答案 1 :(得分:2)

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

答案 2 :(得分:1)

MyString没有构造函数,所以它将使用基类MyNum中的一个,它没有没有参数的默认值。

MyString需要一个构造函数,或者你需要基类中没有参数的构造函数。