Когда вы работаете с классами и наследованием, существуют некоторые правила, которые применяются при создании экземпляров переменных.
Если ваше дерево наследования выглядит примерно так
class Object + class Customer +class FrequentCustomer
Если вы объявите переменную типа Object
в правой части объявления, он может принять любой тип, который находится ниже в дереве наследования.Это означает, что если ваша переменная имеет тип FrequentCustomer
, ей должен быть присвоен только экземпляр FrequentCustomer
.Если он имеет тип Customer
, тогда он может принимать Customer
и FrequentCustomer
и так далее.Все классы наследуют тип object
, поэтому я добавил его в дерево наследования.Ниже приведены все допустимые объявления.
object c = new Customer();
object c = new FrequesntCustomer();
Customer c = new Customer();
Customer c = new FequentCustomer();
FrequentCustomer c = new FrequentCustomer();
Вот почему возникает ваша первая ошибка компиляции.
Вторая ошибка связана с неправильным использованием метода Convert.ToInt32()
.Правильный синтаксис:
Console.WriteLine("\naRegularCustomer #{0} owes {1}",
aRegularCustomer.CustNum,
Convert.ToInt32(aRegularCustomer.CustBalance)); // im having a error here
Ваша третья ошибка - не ошибка, а только предупреждение.Класс FrequentCustomer
уже имеет унаследованные от Customer
свойства, даже если вы не указали их явно.Это означает, что вам не нужно указывать свойство CustNum
в классе FrequentCustomer
, оно уже унаследовано.Однако, если по какой-то причине вам нужно добавить свойство (например, у него другая реализация, чем у его родительского класса), вам нужно добавить ключевое слово new
в это свойство следующим образом:
public new int CustNum
{
get
{
return base.CustNum;
}
set
{
CustNum = value;
}
}
Если вы этого не сделаете, это будет сделано автоматически (скрытие унаследованного члена), но вы получите предупреждение об этом.