Автор: klem4 1.10.2006 22:03
Есть базовый класс с виртуальной функцией, производный класс с перегруженной виртуальной функцией базового класса и своей собственное - не виртуальной.
В программе создаются : Объект базового класса, объект производного класса и ссылка на объект базового класса.
Вопрос : Как нужно произвести преобразование ссылки (Ref) так чтобы она указывала на объект производного класса с возможностью использования его не виртуальной функции ?
Код
using System;
namespace ConsoleApplication1
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
Base B = new Base();
Drived D = new Drived();
Base Ref;
}
}
class Base
{
public virtual int virtualF()
{
return 0;
}
}
class Drived: Base
{
public override int virtualF()
{
return 1;
}
public int noVirtualF()
{
return 2;
}
}
}
Или при таком раскладе меняя Ref = B, Ref = D, я смогу использовать только их виртуальные функции ?
Автор: klem4 1.10.2006 22:33
Кажись разобрался :
Код
static void Main(string[] args)
{
Base B = new Base();
Drived D = new Drived();
Base Ref;
Ref = D;
Console.WriteLine(((Drived)Ref).noVirtualF());
Console.ReadLine();
}
Автор: klem4 2.10.2006 0:24
И всетаки это не то. В данном конкретном случае годится, но я видимо привел не верный пример, ситуация такая :
Есть иерархия классов: Точка, Точка -> Окружность, Точка -> Прям. Тругольник, Точка -> Квадрат
выглядит она так :
Исходный код
// TPoint
class TPoint
{
public double GetPointArea()
{
return 0;
}
public virtual double GetArea()
{
return 0;
}
}
// TCircle
class TCircle: TPoint
{
private int r;
public TCircle()
{
Radius = 0;
}
public TCircle(int r)
{
Radius = r;
}
public double GetCircleArea()
{
return 3.14 * Radius * Radius;
}
public override double GetArea()
{
return 3.14 * Radius * Radius;
}
public int GetDiametr()
{
return 2 * Radius * Radius;
}
public int Radius
{
get
{
return this.r;
}
set
{
try
{
this.r = value;
}
catch(Exception)
{
this.r = 0;
}
}
}
}
// TRectTriangle
class TRectTriangle: TPoint
{
private int a; // sizeA
private int b; // sizeB;
public TRectTriangle()
{
sizeA = 0;
sizeB = 0;
}
public TRectTriangle(int a, int b)
{
sizeA = a;
sizeB = b;
}
public double GetRectTriangleArea()
{
return 0.5 * sizeA * sizeB;
}
public override double GetArea()
{
return 0.5 * sizeA * sizeB;
}
public double GetPerimetr()
{
return sizeA + sizeB + Math.Sqrt(sizeA*sizeA + sizeB*sizeB);
}
public int sizeA
{
get
{
return this.a;
}
set
{
try
{
this.a = value;
}
catch(Exception)
{
this.a = 0;
}
}
}
public int sizeB
{
get
{
return this.b;
}
set
{
try
{
this.b = value;
}
catch(Exception)
{
this.b = 0;
}
}
}
}
class TSquare: TPoint
{
private int s; // size
public TSquare()
{
size = 0;
}
public TSquare(int s)
{
size = s;
}
public int GetSquareArea()
{
return size * size;
}
public override double GetArea()
{
return size * size;
}
public int GetPerimetr()
{
return 4 * size;
}
public int size
{
get
{
return this.s;
}
set
{
try
{
this.s = value;
}
catch(Exception)
{
this.s = 0;
}
}
}
}
В основной программе есть по объекту (экземпляру) каждого класса и переменная ссылка на базовый класс
Код
TPoint Ref;
На форме я по средством чекбоксов выбираю какой объект у меня будет активный и при обработке конкретного чекбокса например тот которыйрый будет значить что активна окружность, я должен ссылке передать адрес нужного объекта, я делаю это явно не правельно.
Код
private void rdBtnCircle_CheckedChanged(object sender, System.EventArgs e)
{
lblActive.Text = "Окружность";
Ref = ((TCircle)Ref);
Ref = Circle;
}
NEED HELP =(
Автор: klem4 2.10.2006 0:46
Вот придумал сделать так :
Код
private void rdBtnCircle_CheckedChanged(object sender, System.EventArgs e)
{
lblActive.Text = "Окружность";
Ref = new TCircle();
Ref = Circle;
}
Но верно ли это ?! В общем видимо да
_
=((((((( Не, работает не правильно
Ну всееее теперь врое точно понял !
Код
Ref = new TCircle();
Ref = Circle;
А дальше где надо проверять :
Код
if (Ref is TCircle)
{
(Ref as TCircle).Имя_Нужной_Функции
}
Ура !!