Переменные базового класса и производного класса

С# является языком со строгой типизацией, в нем требуется строгое соблюдение совместимости типов с учетом стандартных преобразований типов. Из чего следует, что переменная одного типа обычно не может ссылаться на объект другого ссылочного типа. За одним небольшим исключением – ссылочная переменная базового класса может ссылаться на объект любого производного класса.

Продемонстрируем это на примере:

class DemoPoint

{

public int x;

public int y;

public void Show()

{ Console.WriteLine("точка на плоскости: ({0}, {1})",x, y); }

public DemoPoint (int x, int y)

{ this.x=x; this.y=y; }

}

 

class DemoShape : DemoPoint

{

public int z;

new public void Show()

{

Console.WriteLine("точка в пространстве: ({0}, {1}, {2})", x, y, z);

}

public DemoShape(int x, int y, int z):base(x, y)

{ this.z=z; }

}

class Program

{

static void Main()

{

DemoPoint point1 = new DemoPoint(0,1);

Console.WriteLine("({0}, {1})",point1.x,point1.y);

DemoShape pointShape = new DemoShape(2,3,4);

Console.WriteLine(pointShape.x + "," + pointShape.y + "," + pointShape.z);

DemoPoint point2=pointShape; //допустимая операция

//ошибка - не соответствие типов указателей

//pointShape=point1;

Console.WriteLine("({0}, {1})", point2.x, point2.y);

//ошибка, т.к. в классе DemoPoint нет поля z

//Console.WriteLine("({0}, {1}, {2})", point2.x, point2.y, point2.z);

}

}

Ошибка возникнет и при попытке через объект point2 обратиться к методу Show. Например, point2.Show(). В этом случае компилятор не сможет определить, какой метод Show вызвать – для базового или для производного класса. Для решения данной проблемы можно воспользоваться таким понятием как полиморфизм, который основывается на механизме виртуальных методов.

 

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

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

class DemoPoint //базовый класс

{

protected int x;

protected int y;

public virtual void Show() //виртуальный метод

{ Console.WriteLine("точка на плоскости: ({0}, {1})",x, y); }

public DemoPoint (int x, int y)

{ this.x=x; this.y=y; }

}

class DemoShape : DemoPoint //производный класс

{

protected int z;

public override void Show() //перегрузка виртуального метода

{

Console.WriteLine("точка в пространстве: ({0}, {1}, {2})", x, y, z);

}

 

public DemoShape(int x, int y, int z):base(x, y) //конструктор производного класса

{ this.z=z; }

}

class DemoLine : DemoPoint //производный класс

{

protected int x2;

protected int y2;

public override void Show() //перегрузка виртуального метода

{

Console.WriteLine("отрезок на плоскости: ({0}, {1})-({2},{3})",x,y, x2, y2);

}

public DemoLine(int x1, int y1, int x2, int y2):base(x1, y1)

{ this.x2 = x2; this.y2 = y2; }

}

class Program

{

static void Main()

{

DemoPoint point1 = new DemoPoint(0,1); point1.Show();

DemoShape pointShape = new DemoShape(2,3,4);

pointShape.Show();

DemoLine line = new DemoLine(0,0, 10, 10); line.Show();

Console.WriteLine();

//использование ссылки базового класса на объекты производных классов

DemoPoint point2=pointShape; point2.Show();

point2=line; point2.Show();

}

}

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

 








Дата добавления: 2015-10-26; просмотров: 1514;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.006 сек.