Главная · Карта сайта · Поиск · Статьи · Компьютерные курсы · Обучающие программы · Открытые проекты · Веб-программирование · Создание интернет-сайта · Полезные ссылки · Глоссарий · Контакты · Декабрь 06 2016 22:50:16
Последнее опубликованное

Что такое Model-View-Controller
Pattern Model-View-Controller

Как создать свой веб-сайт
Как создать свой сайт в интернете

Разное
Статистика

Программирование на C#. Наследование и полиморфизм


[Назад] [Следующая страница]

1.2. Реализация наследования на C#

Теперь самое время продемонстрировать, как средствами C# реализуются два основополагающих понятия ООП: наследование и полиморфизм. Ниже представлены определения классов, являющихся частью иерархии классов геометрии: Geometry2D – абстрактный класс, который по совместительству базовый класс всех геометрических объектов, PointGeometry – та самая точечная геометрия, о которой говорилось выше и Label – расширение PointGeometry для хранения подписи точки (описание на следующей странице).

Класс Geometry2D определен, как абстрактный, поскольку не имеет ровно никакого смысла создавать его экземпляры. Абстрактные классы вбирают в себя все то, что объединяет производные в иерархии классы: общие поля и свойства, спецификации методов и базовое поведение. Например, класс Geometry2D объявляет спецификацию функции Clone(), реализация которой должна присутствовать в производных классах. Спецификация метода, свойства или функции не требует реализации по умолчанию. Спецификации также обозначаются с использованием ключевого слова abstract.

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

В C# да и во всех CLR исполняемых языках поддерживается только одиночное наследование. Т.е. такие фокусы, как в C++ с одновременным наследованием от кресла, колеса и расписания автобусов здесь не получатся. Для подобных целей используют интерфейсы.

using System;
namespace CSharpQuickGuide
{
    //Тип пространственных данных
    public enum EGeometryType
    {
        //тип неопределен
        gtUndefined = 0,
        //точечная геометрия
        gtPoint = 1,
        //линейная геометрия
        gtLinear = 2,
        //площадная геометрия
        gtArea = 4
    }
    //Асбтрактный класс геометрии 2D
    public abstract class Geometry2D
    {
        //Тип геометрии, определяемый производным классом.
        //Тип геометрии меняться не должен, поэтому 
        //поле m_Type определено с модификатором readonly
        private readonly EGeometryType m_Type = EGeometryType.gtUndefined;
        //Защищенный конструктор, вызываемый производным классом
        //для определение типа геометрии
        protected Geometry2D(EGeometryType _Type)
        {
            m_Type = _Type;
        }
        //Свойство 'тип геометрии' только для чтения
        public EGeometryType Type
        {
            get { return m_Type; }
        }
        //Абстрактный метод клонирования геометрии,
        //реализация которого обязана присутсвовать
        //в производном классе
        public abstract Geometry2D Clone();
    }
}

Класс PointGeometry – самый обычный производный класс, который обязан реализовать все спецификации, объявленные в базовом абстрактном классе, если такие есть. И он это делает. Модификатор override необходим для того, чтобы сообщить компилятору, что метод или свойство определяет реализацию абстрактного метода (метод Clone()) или переопределяет реализацию виртуального метода в базовом классе.

Важное замечание: если в базовом классе метод является абстрактным, а не виртуальным, как в нашем примере это случилось с методом Clone(), то все его реализации и переопределения в производных классах, тем не менее, ведут себя как виртуальные методы.

Указатели на виртуальные методы хранятся в отдельной таблице (таблица виртуальных методов), с которой связан экземпляр объекта. Именно механизм виртуальных методов используется для реализации полиморфизма в C#. Как работает этот механизм, будет продемонстрировано далее, в сравнении с обычным переопределением метода, ну а пока знакомимся с исходным кодом производного класса PointGeometry.

using System;
namespace CSharpQuickGuide
{
    //Класс 'Точечная ориентированная геометрия'
    public class PointGeometry : Geometry2D 
    {
        //Местоположение геометрии
        private Point2D m_Origin;
        //Ориентация геометрии
        private Vector2D m_Orientation;
        //Конструктор по умолчанию
        public PointGeometry()
            //Вызов конструктора базового класса Geometry2D
            : base(EGeometryType.gtPoint)
        {
            m_Origin = new Point2D();
            m_Orientation = new Vector2D(); 
        }
        //Конструктор с параметром - точкой
        public PointGeometry(Point2D _Point)
            //Вызов конструктора по умолчанию
            : this()
        {
            //Копирование местоположения геометрии
            m_Origin.Copy(_Point);  
        }
        //Координаты геометрии
        public Point2D Origin
        {
            get { return m_Origin; }
            set
            {
                //Если аргумент не определен
                if (value == null)
                    //то возбуждаем исключение
                    throw new NullReferenceException("Origin value is null!");

                m_Origin = value;
            }
        }
        //Ориентация геометрии
        public Vector2D Orientation
        {
            get { return m_Orientation; }
        }
        //Переопределение функции клонирования
        public override Geometry2D Clone()
        {
            //реализация отсутствует
            throw new NotImplementedException();
        }
        //Разбор строки и инициализация геометрии
        public void Parse(string _Geometry)
        {
            //реализация отсутствует
            throw new NotImplementedException();
        }
    }
}


[Назад] [Следующая страница]

Компьютерные курсы и курсы программирования
Основы программирования

Курс для начинающих программистов на C# и VB.NET.

SQL 25™

Построение SQL запросов и работа с базой данных.

C# Quick Guide™

Программирование на C#. Краткое руководство.

RegEx

Применение регулярных выражений.

Plug-in архитектура

Примеры программной Plug-in архитектуры.

XML и его расширения

Язык разметки XML и его расширения с примерами.

HTML и разметка гипертекста

Языки HTML, XHTML и CSS с примерами разметки.

Основы веб-дизайна

Основы веб-дизайна: решения типовых задач верстки.

Программирование на PHP

Руководство по программированию на PHP для начинающих.

Справочные материалы

Шаблоны проектирования
Каталог шаблонов проектирования программных компонентов.

Рефакторинг кода
Каталог приемов рефакторинга программного кода.

Гость
Имя

Пароль



Забыли пароль?
Запросите новый здесь
.
Coding Craft. Все права защищены © 2011. Проект Инициативного Народного Фронта Образования - ИНФО-проект.