Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Классы.Наследование

Автор: 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;
            
        }


Но верно ли это ?! В общем видимо да smile.gif_


=((((((( Не, работает не правильно

Ну всееее теперь врое точно понял !

Код

Ref = new TCircle();
Ref = Circle;


А дальше где надо проверять :

Код

if (Ref is TCircle)
{
  (Ref as TCircle).Имя_Нужной_Функции
}


Ура !!