Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет: Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.
Как активировать код? |
Наследование в C#
Существует два способа повторного использования ранее разработанного и откомпилированного кода (простое копирование исходного кода в новый - не в счет):
- Композиция - создание в новом коде экземпляров уже существующих классов (встраивание кода на уровне экземпляров классов)
- Наследование - расширение существующих классов с помощью специального механизма (встраивание на уровне самих классов)
Приведем пример кода, иллюстрирующего композицию. Пусть в нашем распоряжении имеется ранее разработанный (нами или кем-то другим) класс, моделирующий точку. Назовем его 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
Результат выполнения программы будет таким
Теперь рассмотрим вопросы повторного использования кода с помощью механизма наследования.