Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1435 / 157 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 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. Ввожу код на сайте, пишет:

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

 

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