Пример динамического наследования методов
В качестве примера динамического наследования методов используем ту же цепочку наследуемых классов, но, во время работы программы, поместим 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 – Динамическое наследование методов
Печать содержимого элементов стека является примером полиморфизма (динамического наследования методов). Действительно, «статически» печать элемента стека рассчитана на печать элемента простейшей геометрической фигуры. Но в процессе работы программы (в этом суть динамического наследования методов) в стек помещаются объекты классов точка и круг.
Дата добавления: 2018-11-25; просмотров: 317;