|
Прошел курс. Получил код 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
Результат выполнения программы будет таким
Теперь рассмотрим вопросы повторного использования кода с помощью механизма наследования.
