Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

С#: Приведение вверх, почему?

36K
18 июня 2008 года
YouAreEmpty
11 / / 17.06.2008
Привет! Возникла такая проблема: есть интерфейс 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!!!

Объясните, пожалуйста, почему произошло приведение вверх и как это можно исправить?
320
18 июня 2008 года
m_Valery
1.0K / / 08.01.2007
Класс 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();
        }
    }...
36K
18 июня 2008 года
YouAreEmpty
11 / / 17.06.2008
Цитата: m_Valery
Класс 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();
        }
    }...



А если в интерфейсе ISeries методов больше, а я не знаю как они реализованы в базовом классе, или меня устраивает их работа в классе-родителе, что тогда?

5
18 июня 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: YouAreEmpty
А если в интерфейсе ISeries методов больше, а я не знаю как они реализованы в базовом классе, или меня устраивает их работа в классе-родителе, что тогда?


У вас классическая ошибка.
В базовом классе нужно сделать эти методы (интерфейса ISeries) виртуальными.
У потомков переопределять методы (override) по необходимости.

320
18 июня 2008 года
m_Valery
1.0K / / 08.01.2007
Цитата: YouAreEmpty
А если в интерфейсе ISeries методов больше, а я не знаю как они реализованы в базовом классе, или меня устраивает их работа в классе-родителе, что тогда?



Так это тебе как разработчику решать надо нужна тебе реализация интерфейса или нет.Тут важно понимать,что реализация интерфейса подчиняется принципу "всё или ничего",т.е тип реализующий интерфейс не может селективно реализовывать методы ,этот метод беру,а это - фу-у,не,не беру.Если реализуешь то все методы.Т.е класс ByTwo должен реализовать все методы интерфейса,а ByThree может реализовать выборочно,поскольку он наследует ByTwo,если б не наследовал,то тоже должен был реализовать все методы.Или делай как hardcase говорит,обьяви все методы в базовом классе виртуальными и в производном реализуй выборочно...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог