C # класс наследования ада - PullRequest
1 голос
/ 19 мая 2019

Я не могу понять, почему я не могу установить объект Class3 из типа объекта Class2, если Class3 наследуется от Class2 (см. Комментарии об ошибке).

То же самое работает, если я передаютип объекта Class3 как параметр Class2 (см. Class2.Method ())

namespace Classes
{
    class Class1 
    {
        public static void Main() 
        {
            Class3 item = new Class3();
            Class2.Method(item); // This works!

            Class3 item2 = Class2.Method2(); // Compile error!
            Class3 item3 = (Class3) Class2.Method2(); // Runtime error!
        }
    }

    class Class2 
    {
        public static void Method(Class2 item) 
        {
        }

        public static Class2 Method2() 
        {
            Class2 item = new Class2();
            return item;
        }
    }

    class Class3: Class2 {}
}

Ответы [ 2 ]

2 голосов
/ 19 мая 2019

С наследованием вы можете указывать только тип, ссылающийся на родителя, но не обратный. В вашем примере 3 получено из 2, поэтому 2 не имеет ни малейшего представления о нем.

Теперь, чтобы правильно привести приведение типа, оберните объект, чтобы получить доступ к методу родителя.

var tmp3 = new Class3();
((Class2)tmp3).Method2();

Сказанное является основополагающим. Я знаю, что я 3-й класс, но я хочу смотреть, как мой родитель через (Class2) tmp3. Но когда я хочу вызвать метод для этого экземпляра Class2, мне нужно закрыть ссылку на все это перед вызовом метода.

2 голосов
/ 19 мая 2019

Class3 является специфическим видом Class2. Вы не можете назначить Class2 экземпляр для ссылки Class3, просто Class3 (или наследующие типы) ссылки.

Вы можете думать об этом в следующих терминах: «Каждый Class3 - это Class2, но не каждый Class2 - это Class3».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...