Чтение онлайн

на главную - закладки

Жанры

C# 4.0 полное руководство - 2011

Шилдт Герберт

Шрифт:

get { return pri_width; }

set { pri_width = value < 0 ?
– value : value; }

}

public double Height {

get { return pri_height; }

set -{ pri_height = value < 0 ?
– value : value; }

}

public string name { get; set; }

public void ShowDim {

Console.WriteLine("Ширина и высота равны " +

Width + " и " + Height);

}

public virtual double Area {

Console.WriteLine("Метод Area

должен быть переопределен"); return 0.0;

}

}

// Класс для треугольников, производный от класса TwoDShape.

class Triangle : TwoDShape { string Style;

// Конструктор, используемый по умолчанию, public Triangle {

Style = "null";

}

// Конструктор для класса Triangle, public Triangle(string s, double w, double h) : base (w, h, "треугольник") {

Style = s;

}

// Сконструировать равнобедренный треугольник, public Triangle(double x) : base(x, "треугольник") {

Style = "равнобедренный";

}

// Сконструировать копию объекта типа Triangle, public Triangle(Triangle ob) : base(ob) {

Style = ob.Style;

}

// Переопределить метод Area для класса Triangle, public override double Area { return Width * Height / 2;

}

// Показать тип треугольника, public void ShowStyle {

Console.WriteLine("Треугольник " + Style);

}

I/ Класс для прямоугольников, производный от класса TwoDShape. class Rectangle : TwoDShape {

// Конструктор для класса Rectangle, public Rectangle(double w, double h) : base (w, h, "прямоугольник") { }

// Сконструировать квадрат, public Rectangle(double x) : base(x, "прямоугольник") { }

// Сконструировать копию объекта типа Rectangle, public Rectangle(Rectangle ob) : base(ob) { }

// Возвратить логическое значение true, если // прямоугольник окажется квадратом, public bool IsSquareO {

if(Width == Height) return true; return false;

}

// Переопределить метод Area для класса Rectangle, public override double Area { return Width * Height;

}

}

class DynShapes {

static void Main {

TwoDShape[] shapes = new TwoDShape[5] ;

shapes[0] = new Triangle("прямоугольный", 8.0, 12.0); shapes[1] = new Rectangle(10);

shapes[2] = new Rectangle(10, 4);

shapes[3] = new Triangle(7.0);

shapes[4] = new TwoDShape(10, 20, "общая форма");

for (int i=0; i < shapes.Length; i++) {

Console.WriteLine("Объект — " + shapes[i].name);

Console.WriteLine("Площадь равна " + shapes[i].Area);

Console.WriteLine;

}

}

}

При

выполнении этой программы получается следующий результат.

Объект — треугольник Площадь равна 48

Объект — прямоугольник Площадь равна 100

Площадь равна 40

Объект — треугольник Площадь равна 24.5

Объект — общая форма

Метод Area должен быть переопределен Площадь равна 0

Рассмотрим данный пример программы более подробно. Прежде всего, метод Area объявляется как virtual в классе TwoDShape и переопределяется в классах Triangle и Rectangle по объяснявшимся ранее причинам. В классе TwoDShape метод Area реализован в виде заполнителя, который сообщает о том, что пользователь данного метода должен переопределить его в производном классе. Каждое переопределение метода Area предоставляет конкретную его реализацию, соответствующую типу объекта, инкапсулируемого в производном классе. Так, если реализовать класс для эллипсов, то метод Area должен вычислять площадь эллипса.

У программы из рассматриваемого здесь примера имеется еще одна примечательная особенность. Обратите внимание на то, что в методе Main двумерные формы объявляются в виде массива объектов типа TwoDShape, но элементам этого массива присваиваются ссылки на объекты классов Triangle, Rectangle и TwoDShape. И это вполне допустимо, поскольку по ссылке на базовый класс можно обращаться к объекту прризводного класса. Далее в программе происходит циклическое обращения к элементам данного массива для вывода сведений о каждом объекте. Несмотря на всю свою простоту, данный пример наглядно демонстрирует преимущества наследования и переопределения методов. Тип объекта, хранящийся в переменной ссылки на базовый класс, определяется во время выполнения и соответственно обусловливает дальнейшие действия. Так, если объект является производным от класса TwoDShape, то для получения его площади вызывается метод Area . Но интерфейс для выполнения этой операции остается тем же самым независимо от типа используемой двумерной формы.

Применение абстрактных классов

Иногда требуется создать базовый класс, в котором определяется лишь самая общая форма для всех его производных классов, а наполнение ее деталями предоставляется каждому из этих классов. В таком классе определяется лишь характер методов, которые должны быть конкретно реализованы в производных классах, а не в самом базовом классе. Подобная ситуация возникает, например, в связи с невозможностью получить содержательную реализацию метода в базовом классе. Именно такая ситуация была продемонстрирована в варианте класса TwoDShape из предыдущего примера, где метод Area был просто определен как заполнитель. Такой метод не вычисляет и не выводит площадь двумерного объекта любого типа.

Поделиться:
Популярные книги

Законы Рода. Том 5

Flow Ascold
5. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 5

Паладин из прошлого тысячелетия

Еслер Андрей
1. Соприкосновение миров
Фантастика:
боевая фантастика
попаданцы
6.25
рейтинг книги
Паладин из прошлого тысячелетия

Русь. Строительство империи

Гросов Виктор
1. Вежа. Русь
Фантастика:
альтернативная история
рпг
5.00
рейтинг книги
Русь. Строительство империи

По машинам! Танкист из будущего

Корчевский Юрий Григорьевич
1. Я из СМЕРШа
Фантастика:
боевая фантастика
попаданцы
альтернативная история
6.36
рейтинг книги
По машинам! Танкист из будущего

Вечный. Книга IV

Рокотов Алексей
4. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга IV

Новик

Ланцов Михаил Алексеевич
2. Помещик
Фантастика:
альтернативная история
6.67
рейтинг книги
Новик

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Новый Рал 5

Северный Лис
5. Рал!
Фантастика:
попаданцы
5.00
рейтинг книги
Новый Рал 5

Невеста напрокат

Завгородняя Анна Александровна
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Невеста напрокат

Волков. Гимназия №6

Пылаев Валерий
1. Волков
Фантастика:
попаданцы
альтернативная история
аниме
7.00
рейтинг книги
Волков. Гимназия №6

Хозяйка лавандовой долины

Скор Элен
2. Хозяйка своей судьбы
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Хозяйка лавандовой долины

На границе империй. Том 5

INDIGO
5. Фортуна дама переменчивая
Фантастика:
боевая фантастика
попаданцы
7.50
рейтинг книги
На границе империй. Том 5

Виктор Глухов агент Ада. Компиляция. Книги 1-15

Сухинин Владимир Александрович
Виктор Глухов агент Ада
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Виктор Глухов агент Ада. Компиляция. Книги 1-15

Болотник 3

Панченко Андрей Алексеевич
3. Болотник
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Болотник 3