none
Наследование Интерфейсов RRS feed

  • Вопрос

  • Здраствуйте, всем!!!

    Вопрос: Почему обращаясь через объект id к методу А, будет выполнятся метод А класса Base, а не класса Derived?

    По идеи: если мы к объекту id присвоили объект типа Derived,  значит id будет иметь ссылку на объект типа Derived
    а почему выполняется метод А класса Base !?

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication165
    {
        interface IBase
        {
            void A();
        }
        class Base : IBase
        {
            public virtual void A() { Console.WriteLine("Выполнился метод A класса Base"); }
        }
        class Derived : Base
        {
            public override void A() { Console.WriteLine("Выполнился метод А класса Derived"); }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                Derived d = new Derived();
                d.A();
    
                IBase id = d;
                id.A();
            }
        }
    }
    • Перемещено Siddharth Chavan 1 октября 2010 г. 21:46 MSDN Forums Consolidation (От:Visual C#)
    1 марта 2010 г. 4:20

Ответы

  • А то что мы к объекту id который приведён к интерфейсу, присвоили объект d типа Derived, это ничего не значит что ли
    или объект id перебивает ссылку на объект типа Derived?


    Давайте по порядку. что мы имеем
    IBase c методом А,
    класс Base, реализующий интерфейс IBase
    и класс Derived, унаследованный от Base.
    Создаем объект типа Derived. ссылка на объект хранится в переменной d.
    Создаем переменную id типа IBase и приводим d к IBase.
    напомню иерархию
    Derived->Base->IBase
    Переменную d приводим к интерфейсу IBase.
    Какой класс реализует интерфейс  IBase? правильно, класс Base.
    Поэтому, приводя к интерфейсу, id сссылается на метод, расположенный в классе Base.
    Ведь метода IBase.A() нет в классе Derived.
    Согласны?
    • Помечено в качестве ответа Druny 1 марта 2010 г. 6:27
    1 марта 2010 г. 6:19

Все ответы

  • Попробуйте  вот так

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    namespace ConsoleApplication165
    {
        interface IBase
        {
            void A();
        }
        public class Base : IBase
        {
            public void A() { Console.WriteLine("Выполнился метод A класса Base"); }
        }
        public class Derived : Base, IBase
        {
            public new void A() { Console.WriteLine("Выполнился метод А класса Derived"); }
    
            void IBase.A()
            {
                Console.WriteLine("Выполнился метод А класса Derived");
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                Derived d = new Derived();
                d.A();
    
                IBase id = d;
                id.A();
                Console.Read();
            }
        }
    }
    



    и почитайте вот это, например
    Определение интерфейса нельзя переопредеоить, если вам все же нужно плцчить интерфейс, либо еше раз отнаследуйте Derived от IBase и определите метод заново.
    И еще. Такое использование интерфейса - ошибка, если вам нужен функционал класса Basе делайте так

    Base id = d;//не интерфейс, а базовый класс
    1 марта 2010 г. 4:42
  • Вот блин я не правильно написал Код( не с виртуальнми методами)!!! SORRY!!

    Вот Привильно!!











    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication165 { interface IBase { void A(); } class Base : IBase { public void A() { Console.WriteLine("Выполнился метод A класса Base"); } } class Derived : Base { public new void A() { Console.WriteLine("Выполнился метод А класса Derived"); } } class Program { static void Main(string[] args) { Derived d = new Derived(); d.A(); IBase id = d; id.A(); } } }




    А вопрос остаётся тот же :

    Вопрос: Почему обращаясь через объект id к методу А, будет выполнятся метод А класса Base, а не класса Derived?

    По идеи: если мы к объекту id присвоили объект типа Derived,  значит id будет иметь ссылку на объект типа Derived
    а почему выполняется метод А класса Base !?

    1 марта 2010 г. 4:50
  • Я английский плохо знаю и из этой темы по ссылке http://www.williamcaputo.com/archives/000138.html наверно ничего не пойму
    можно на Русском языке!!

    Или опиши что ты там понял!!!

    1 марта 2010 г. 4:56
  • "
    Определение интерфейса нельзя переопределить, если вам все же нужно получить интерфейс, либо еше раз отнаследуйте Derived от IBase и определите метод заново.
    И еще. Такое использование интерфейса - ошибка,
     если вам нужен функционал класса Basе делайте так

    Base id = d;//не интерфейс, а базовый класс
    


    "

    • Предложено в качестве ответа Nikonorov Evgeniy 1 марта 2010 г. 4:59
    • Отменено предложение в качестве ответа Druny 1 марта 2010 г. 5:35
    1 марта 2010 г. 4:59
  • Это всё понятно!!!

    А почему так получается, что при выполнении выражения id.A(); выполняется метод А класса Base
    если объект id присвоил объект d который имеет ссылку на объект типа класса Derived?

    1 марта 2010 г. 5:09
  • потому что приводя к интерфейсу вы получаете ссылку на функциональность, реализующую этот интерфейс. В вашем случае интерфейс реализует класс Base, поэтому и метод ссылается на Base

    1 марта 2010 г. 5:12
  • А то что мы к объекту id который приведён к интерфейсу, присвоили объект d типа Derived, это ничего не значит что ли
    или объект id перебивает ссылку на объект типа Derived?

    1 марта 2010 г. 5:20
  • А то что мы к объекту id который приведён к интерфейсу, присвоили объект d типа Derived, это ничего не значит что ли
    или объект id перебивает ссылку на объект типа Derived?


    Давайте по порядку. что мы имеем
    IBase c методом А,
    класс Base, реализующий интерфейс IBase
    и класс Derived, унаследованный от Base.
    Создаем объект типа Derived. ссылка на объект хранится в переменной d.
    Создаем переменную id типа IBase и приводим d к IBase.
    напомню иерархию
    Derived->Base->IBase
    Переменную d приводим к интерфейсу IBase.
    Какой класс реализует интерфейс  IBase? правильно, класс Base.
    Поэтому, приводя к интерфейсу, id сссылается на метод, расположенный в классе Base.
    Ведь метода IBase.A() нет в классе Derived.
    Согласны?
    • Помечено в качестве ответа Druny 1 марта 2010 г. 6:27
    1 марта 2010 г. 6:19
  • Спасибо !!!

    1 марта 2010 г. 6:28
  • рад был помочь :)
    1 марта 2010 г. 6:41