С#: Приведение вверх, почему?
Есть класс ByTwo, реализующий этот интерфейс. Есть класс ByThree, который является потомком класса и в котором метод getNext() переписан.
Далее:
создаем объект ByTwo: ByTwo bs=new ByTwo();
создаем объект ByThree: ByThree bt=New ByThree();
и объявляем ссылку на ISeries: ISeries iser;
Если в программе написать следующее:
iser=bs;
iser.getNext(); возвращает результат как ByTwo
iser=bt;
iser.getNext(); и здесь тоже возвращает результат как ByTwo, не как ByThree!!!
Объясните, пожалуйста, почему произошло приведение вверх и как это можно исправить?
public interface ISeries
{
void getNext();
}
internal class ByTwo : ISeries
{
public ByTwo() { }
void ISeries.getNext()
{
Console.WriteLine("getNext() called in ByTwo...");
}
}
internal class ByThree : ByTwo,ISeries
{
public ByThree() { }
void ISeries.getNext()
{
Console.WriteLine("getNext() called in ByThree...");
}
}
class Program
{
static void Main(string[] args)
{
ByTwo bs = new ByTwo();
ByThree bt = new ByThree();
ISeries iser;
iser = bs;
iser.getNext();
iser = bt;
iser.getNext();
}
}...
public interface ISeries
{
void getNext();
}
internal class ByTwo : ISeries
{
public ByTwo() { }
void ISeries.getNext()
{
Console.WriteLine("getNext() called in ByTwo...");
}
}
internal class ByThree : ByTwo,ISeries
{
public ByThree() { }
void ISeries.getNext()
{
Console.WriteLine("getNext() called in ByThree...");
}
}
class Program
{
static void Main(string[] args)
{
ByTwo bs = new ByTwo();
ByThree bt = new ByThree();
ISeries iser;
iser = bs;
iser.getNext();
iser = bt;
iser.getNext();
}
}...
А если в интерфейсе ISeries методов больше, а я не знаю как они реализованы в базовом классе, или меня устраивает их работа в классе-родителе, что тогда?
У вас классическая ошибка.
В базовом классе нужно сделать эти методы (интерфейса ISeries) виртуальными.
У потомков переопределять методы (override) по необходимости.
Так это тебе как разработчику решать надо нужна тебе реализация интерфейса или нет.Тут важно понимать,что реализация интерфейса подчиняется принципу "всё или ничего",т.е тип реализующий интерфейс не может селективно реализовывать методы ,этот метод беру,а это - фу-у,не,не беру.Если реализуешь то все методы.Т.е класс ByTwo должен реализовать все методы интерфейса,а ByThree может реализовать выборочно,поскольку он наследует ByTwo,если б не наследовал,то тоже должен был реализовать все методы.Или делай как hardcase говорит,обьяви все методы в базовом классе виртуальными и в производном реализуй выборочно...