2011-06-29 3 views
1

Хорошо, так вот упражнение: Вы должны определить три класса. Один класс с именем MyNum, который содержит переменную типа int. Второй класс, называемый MyString, будет получен из MyNum и содержит строку. Третий класс вызывает MyType и возвращает переменную типа MyNum. Каждому классу будет присвоена функция-конструктор и виртуальная функция, называемая Show. Функция-конструктор MyType получает переменную MyNum, тогда как функция Show MyType будет запускать функцию Show MyNum. Теперь вам нужно установить два объекта типа 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

Кто-нибудь знает, почему у меня эта ошибка? Благодарю.

ответ

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

Ребята, я его отредактировал У меня все еще есть эта ошибка, в классе MyString и в MyType –

+0

Хорошо, у MyNum нет проблем сейчас, но MyString do –

+1

ohh Мне нужно создать специальные конструкторы для производных классов? –

2

MyString неявно имеет конструктор с нулевым аргументом, потому что вы не указали какой-либо конструктор в этом классе. Вы можете либо объявить конструктор zero-arg в суперклассе, либо объявить конструктор one-arg в MyString.

+0

Проблема с 'MyNum', а не' MyString' –

+0

Ему также нужно обработать это в 'MyType', поскольку параметры конструктора имеют другой тип ... –

+0

Ребята, я его отредактировал. У меня все еще есть эта ошибка, в классе MyString и в MyType –

1

MyString не имеет конструктора, поэтому он будет использовать один из базового класса MyNum, который не имеет значения по умолчанию без параметров.

MyString требует конструктора или вам нужен безрисковый в базовом классе.

+0

Ребята, я его отредактировал У меня все еще есть эта ошибка, в классе MyString и в MyType –

+0

См. Ответ Рида выше – DaveShaw

+0

Ему также нужно для обработки этого в «MyType», поскольку параметры конструктора имеют другой тип ... –

Смежные вопросы