Пример динамического наследования методов

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

Исходный код программы:

using System;

using System.Collections;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{ public partial class Form1: Form

{

public int x, y, ra;

public int[,] masi = new int[6,3];

public Stack vstek = new Stack();

public abstract class baseGeo

{

public virtual double ploc() { return 0; }

public abstract string printO();

}

public class tka: baseGeo

{

protected int x, y;

public tka()

{

Random rnd = new Random();

x = (int)Math.Round(rnd.NextDouble() * 100);

y = (int)Math.Round(rnd.NextDouble() * 100);

}

public int gettkax() { return x; }

public int gettkay() { return y; }

public void settka(int xx, int yy)

{

x = xx;

y = yy;

}

override public string printO()

{

return "Точка [" + x.ToString() + "," + y.ToString() + "]";

}

}

public class kryg: tka

{

public kryg()

{

Random rnd = new Random(10);

r = (int)Math.Round(rnd.NextDouble() * 100);

}

public void setkryg(int ax, int ay, int rr)

{

settka(ax, ay);

r = rr;

}

public void getkryg(out int ax, out int ay, out int rr)

{

ax = x;

ay = y;

rr = r;

}

public int getkrygr() { return r; }

override public double ploc() // перекрываем метод

// базового класса

{

return 3.14 * r * r;

}

override public string printO() // перекрываем метод

// класса tka

{

string ss = "";

ss = "Круг с центром: " + base.printO() + "\r\n";

// наследуется функция печати класса tka

ss = ss + " Радиусом = " + r.ToString() + "\r\n";

return ss;

}

private int r;

}

static void vkl(Stack vst, baseGeo n)

{

vst.Push(n);

}

public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

int i,k;

double pl;

string s;

Stack vstek = new Stack();

Random rnd = new Random(20);

// пример динамического наследования методов

for (i = 1; i <= 5; i++)

{

x = (int)Math.Round(rnd.NextDouble() * 100);

y = (int)Math.Round(rnd.NextDouble() * 100);

k = (int)Math.Round(rnd.NextDouble() * 100);

if (k % 2 == 0) k = 0; else k = 1;

if (k == 0)

{

tka a = new tka();

a.settka(x, y);

s = a.printO() + "\r\n";

textBox1.AppendText(s);

s = " Площадь объекта = " + a.ploc().ToString() + "\r\n";

textBox1.AppendText(s);

masi[i, 0] = a.gettkax();

masi[i, 1] = a.gettkay();

masi[i, 2] = 0;

vkl(vstek, a);

}

else

{

kryg c = new kryg();

x = c.gettkax();

y = c.gettkay();

ra = c.getkrygr();

textBox1.AppendText(c.printO());

s = " Площадь объекта = " + c.ploc().ToString() + "\r\n";

textBox1.AppendText(s);

c.getkryg(out masi[i,0], out masi[i,1], out masi[i,2]);

vkl(vstek, c);

}

}

s = "Печать содержимого стека: \r\n";

foreach (baseGeo T in vstek)

s = s + T.printO() + "\r\n";

textBox1.AppendText(s);

Invalidate();

}

private void Form1_Paint(object sender, PaintEventArgs e)

{

Pen myPen = new Pen(Color.Red, 2);

Graphics g = e.Graphics;

for (int i = 1; i <= 5; i++)

{

if (masi[i,2]==0)

{

x = masi[i, 0]; y = masi[i, 1];

g.DrawEllipse(myPen, x, y, 2, 2);

}

else

{

x = masi[i, 0]; y = masi[i, 1]; ra = masi[i, 2];

g.DrawEllipse(myPen, x, y, ra, ra);

}

}

}

}

}

Работа программы представлена на рисунке 10.2.

Рисунок 10.2 – Динамическое наследование методов

Печать содержимого элементов стека является примером полиморфизма (динамического наследования методов). Действительно, «статически» печать элемента стека рассчитана на печать элемента простейшей геометрической фигуры. Но в процессе работы программы (в этом суть динамического наследования методов) в стек помещаются объекты классов точка и круг.

Вопросы для самопроверки

1 Какой класс является базовым классом в иерархической цепочке всех классов языка C#?

2 Какой объект базового или производного классов создается раньше при вызове конструктора производного класса?

3 В чем преимущество цепочек наследуемых классов?

4 Что означает статическое наследование в языке C#?

5 Что означает динамическое наследование в языке C#?

6 Понятие полиморфизма в языке C#?

7 Как реализуется механизм полиморфизма?

8 Как называется метод, объект для которого определяется во время работы программы?

9 Какой класс в языке C# называется абстрактным базовым классом?

10 Что представляет собой таблица виртуальных методов?



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: