Нашли ошибку или опечатку? Выделите текст и нажмите

Поменять цветовую

гамму сайта?

Поменять
Обновления сайта
и новые разделы

Рекомендовать в Google +1

Ссылки на базовый класс и объекты производных классов

42

C# является строго типизированным языком программирования. Помимо стандартных преобразований и автоматического продвижения простых типов значений, в этом языке строго соблюдается принцип совместимости типов. Это означает, что переменная ссылки на объект класса одного типа, как правило, не может ссылаться на объект класса другого типа.

Вообще говоря, переменная ссылки на объект может ссылаться только на объект своего типа.

Но из этого принципа строгого соблюдения типов в C# имеется одно важное исключение: переменной ссылки на объект базового класса может быть присвоена ссылка на объект любого производного от него класса. Такое присваивание считается вполне допустимым, поскольку экземпляр объекта производного типа инкапсулирует экземпляр объекта базового типа. Следовательно, по ссылке на объект базового класса можно обращаться к объекту производного класса:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class ClassA
    {
        public int a;

        public ClassA(int i)
        {
            a = i;
        }
    }

    class ClassB : ClassA
    {
        public int b;

        public ClassB(int r, int i)
            : base(i)
        {
            b = r;
        }
    }

    class ClassC
    {
        public int a;

        public ClassC(int i)
        {
            a = i;
        }
    }

    class Program
    {
        static void Main()
        {
            ClassA objA1 = new ClassA(10);
            ClassA objA2 = new ClassA(5);

            // Присваивание однотипных объектов правильно:
            objA2 = objA1;

            ClassB objB = new ClassB(8, 9);
            // Присваивание объекта, имеющего тип унаследованного класса допускается:
            objA1 = objB;
            // Так нельзя
            // objB = objA1;

            // Присваивать похожие, но не связанные друг с другом
            // принципом наследования объекты нельзя
            ClassC objC = new ClassC(8);
            // objC = objA1;

            Console.ReadLine();
        }
    }
}

Следует особо подчеркнуть, что доступ к конкретным членам класса определяется типом переменной ссылки на объект, а не типом объекта, на который она ссылается. Это означает, что если ссылка на объект производного класса присваивается переменной ссылки на объект базового класса, то доступ разрешается только к тем частям этого объекта, которые определяются базовым классом. И в этом есть своя логика, поскольку базовому классу ничего не известно о тех членах, которые добавлены в производный от него класс.

Один из самых важных моментов для присваивания ссылок на объекты производного класса переменным базового класса наступает тогда, когда конструкторы вызываются в иерархии классов. Как вам должно быть уже известно, в классе нередко определяется конструктор, принимающий объект своего класса в качестве параметра. Благодаря этому в классе может быть сконструирована копия его объекта.

Пройди тесты