Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Виртуальные методы






Виртуальным называется метод, объявляемый с помощью ключевого слова virtual в базовом классе и переопределяемый в одном или нескольких производных классах.

Ссылочную переменную базового класса можно присвоить ссылке на объект любого производного класса, выведенного из этого базового класса.

Таким образом, если базовый класс содержит виртуальный метод и из этого класса выведены производные классы, то при наличии ссылки на различные типы объектов (посредством ссылки на базовый класс) будут выполняться различные версии этого виртуального метода.

При переопределении виртуального метода в производном классе используется модификатор override.

При переопределении метода сигнатуры типа у виртуального и метода-заменителя должны совпадать. Кроме того, виртуальный метод нельзя определять как статический (с использованием слова static) или абстрактный (с использованием слова abstract).

Виртуальный метод переопределять необязательно. Если производный класс не предоставляет собственную версию виртуального метода, используется версия, определенная в базовом классе.

Если производный класс не переопределяет виртуальный метод в случае многоуровневой иерархии, то будет выполнен первый переопределенный метод, который обнаружится при просмотре иерархической лестницы в направлении снизу вверх.

Рассмотрим пример, в котором метод вычисления площади фигуры агеа() объявлен виртуальным в классе TwoDShape, и переопределен в его производных классах таким образом, чтобы он вычислял площадь согласно типу конкретной геометрической фигуры, которую инкапсулирует класс.

 


using System;

 

class TwoDShape

{

double pri_width;

double pri_height;

string pri_name;

 

// Стандартный конструктор

public TwoDShape()

{

width = height = 0.0;

name = " null";

}

 

// Перегруженный конструктор

public TwoDShape(double w, double h, string n)

{

width = w;

height = h;

name = n;

}

 

// Перегруженный конструктор

public TwoDShape(double x, string n)

{

width = height = x;

name = n;

}

 

// Перегруженный конструктор

public TwoDShape(TwoDShape ob)

{

width = ob.width;

height = ob.height;

name = ob.name;

}

 

// Свойства

public double width

{

get { return pri_width; }

set { pri_width = value; }

}

 

public double height

{

get { return pri_height; }

set { pri_height = value; }

}

 

public string name

{

get { return pri_name; }

set { pri_name = value; }

}

 

public void showDim()

{

Console.WriteLine(" Width and height are " + width + " and " + height);

}

 

public virtual double area()

{

Console.WriteLine(" area() must be overridden");

return 0.0;

}

}

 

// Производный класс Треугольник

class Triangle: TwoDShape

{

string style;

 

// Стандартный конструктор

public Triangle()

{

style = " null";

}

 

// Перегруженный конструктор

public Triangle(string s, double w, double h): base(w, h, " triangle")

{

style = s;

}

 

// Перегруженный конструктор

public Triangle(double x): base(x, " triangle")

{

style = " isosceles";

}

 

// Перегруженный конструктор

public Triangle(Triangle ob): base(ob)

{

style = ob.style;

}

 

// Переопределенный метод

public override double area()

{

return width * height / 2;

}

 

public void showStyle()

{

Console.WriteLine(" Triangle is " + style);

}

}

 

// Производный класс Прямоугольник

class Rectangle: TwoDShape

{

// Перегруженный конструктор

public Rectangle(double w, double h):

base(w, h, " rectangle") { }

 

// Перегруженный конструктор

public Rectangle(double x):

base(x, " rectangle") { }

 

// Перегруженный конструктор

public Rectangle(Rectangle ob): base(ob) { }

// Возрврат Истина, если квадрат

public bool isSquare()

{

if (width == height) return true;

return false;

}

 

// Переопределенный метод

public override double area()

{

return width * height;

}

}

 

class DynShapes

{

public static void Main()

{

TwoDShape[] shapes = new TwoDShape[5];

 

shapes[0] = new Triangle(" right", 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, " generic");

 

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

{

Console.WriteLine(" object is " + shapes[i].name);

Console.WriteLine(" Area is " + shapes[i].area());

 

Console.WriteLine();

}

}

}







© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.