Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 9:

Наследование в C#

Аннотация: В данной лекции рассматривается наследование классов, базовые и производные типы, полиморфизм и абстрактные классы.

Существует два способа повторного использования ранее разработанного и откомпилированного кода (простое копирование исходного кода в новый - не в счет):

  1. Композиция - создание в новом коде экземпляров уже существующих классов (встраивание кода на уровне экземпляров классов)
  2. Наследование - расширение существующих классов с помощью специального механизма (встраивание на уровне самих классов)

Приведем пример кода, иллюстрирующего композицию. Пусть в нашем распоряжении имеется ранее разработанный (нами или кем-то другим) класс, моделирующий точку. Назовем его Point. Этот класс может существовать и в откомпилированном виде (или в исходном коде) и храниться где-то в подключаемой к проекту библиотеке. Пусть исходный код этого класса будет таким

using System;
    
namespace Test
{
    class Point
    {
        int x, y;
    
        public int X
        {
            get { return x; }
            set { x = value; }
        }
    
        public int Y
        {
            get { return y; }
            set { y = value; }
        }
    
        public Point()
        {
            x = y = 0;
        }
    
        public Point(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
    
        public void Show()
        {
            Console.WriteLine("x={0}; y={1}", x, y);
        }
    }
}
Листинг 9.1 . Код класса Point

Используем класс Point для моделирования прямоугольника, представленного классом Rectangle. Состояние прямоугольника характеризуется двумя точками (обычно это координаты левого верхнего и правого нижнего углов), из которых можно вычислить другие характеристики, например, ширину, высоту и площадь.

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

namespace Test
{
    class Rectangle
    {
        // Объявляем закрытые ссылки - поля
        Point point1; // Левый верхний угол
        Point point2; // Правый нижний угол
    
        // Конструкторы на все случаи жизни
        public Rectangle()
        {
            point1 = new Point();
            point2 = new Point();
        }
    
        public Rectangle(Point point1, Point point2)
        {
            // Объекты созданы в клиенте
            this.point1 = point1;
            this.point2 = point2;
        }
    
        public Rectangle(int x1, int y1, int width, int height)
        {
            point1 = new Point(x1, y1);
            point2 = new Point(x1 + width, y1 + height);
        }
    
        public Rectangle(int x1, int y1, Int64 x2, int y2)
        {
            point1 = new Point(x1, y1);
            point2 = new Point((int)x2, y2);
        }
    
        // Свойства - сервисы
        // Ширина прямоугольника
        public int Width
        {
            get { return Math.Abs(point2.X - point1.X); }
        }
    
        // Высота прямоугольника
        public int Height
        {
            get { return Math.Abs(point2.Y - point1.Y); }
        }
    
        // Методы - сервисы
        // Площадь прямоугольника
        public int Area()
        {
            return Width * Height;
        }
    
        // Точка внутри прямоугольника
        public bool PointIsRect(Point point)
        {
            bool pointIsHorizontal = point.X >= point1.X && 
    point.X <= point2.X;
            bool pointIsVertical = point.Y >= point1.Y && 
    point.Y <= point2.Y;
            if (pointIsHorizontal && pointIsVertical)
                return true;
            else
                return false;
        }
    
        // Получение координат прямоугольника
        public void GetCoord(out int x1, out int y1, 
    out int x2, out int y2)
        {
            x1 = point1.X;
            y1 = point1.Y;
            x2 = point2.X;
            y2 = point2.Y;
        }
    }
}
Листинг 9.2 . Код класса Rectangle

Использование класса Rectangle

Результат выполнения программы будет таким


Теперь рассмотрим вопросы повторного использования кода с помощью механизма наследования.

Максим Филатов
Максим Филатов

Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет:

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

 

Как активировать код?

Денис Пашков
Денис Пашков
Россия
Татьяна Ковалюк
Татьяна Ковалюк
Украина, Киев, Киевский политехнический институт, 1974