Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
YouAreEmpty
Зарегистрирован: 18.06.2008 Сообщения: 1
|
Добавлено: Ср Июн 18 2008 19:52 Заголовок сообщения: C# и приведение вверх |
|
|
Привет! Возникла такая проблема: есть интерфейс ISeries, в котором обявлен метод getNext().
Есть класс 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!!!
Объясните, пожалуйста, почему произошло приведение вверх и как это можно исправить? |
|
Вернуться к началу |
|
|
abstruct
Зарегистрирован: 01.07.2008 Сообщения: 1
|
Добавлено: Вт Июл 01 2008 13:29 Заголовок сообщения: Re: C# и приведение вверх |
|
|
YouAreEmpty писал(а): | Есть класс ByThree, который является потомком класса и в котором метод getNext() переписан.
|
Как именно переписан? Если просто в класс ByThree добавлен метод getNext(), то, естественно, вызовется метод getNext() базового класса ByTwo.
Можно объявить ByTwo.getNext() как виртуальный и переопределить его в ByThree. Или реализовать ISeries в ByThree. |
|
Вернуться к началу |
|
|
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Чт Окт 30 2008 15:45 Заголовок сообщения: Re: C# и приведение вверх |
|
|
abstruct писал(а): | Как именно переписан? Если просто в класс ByThree добавлен метод getNext(), то, естественно, вызовется метод getNext() базового класса ByTwo |
Нет, не естественно. При добавлении как раз должно быть то, что ожидает YouAreEmpty. У него ошибка в том, переменная iser является экземпляром того класса (ISeries), которому известен его собственный метод getNext(), а не метод, описанный в потомке. Поэтому, несмотря на то, что переменной iser присваивается значение от переменной bt, методы-то от этого не переопределяются. Присваивание не переопределяет методы. Соответственно вызывается не метод, описанный в потомке (он просто неизвестен), а свой собственный метод.
предполагаю (но не уверен, потому что вообще не понимаю смысла этих манипуляций), что YouAreEmpty должен был сделать приведение типов:
Код: | (ByThree)iser.getNext(); | вместо просто iser.getNext();
------------------------------------
не ругайте программистов за ошибки. это не они виноваты -- это общество сделало их такими |
|
Вернуться к началу |
|
|
|