![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
klem4 |
![]()
Сообщение
#1
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Есть базовый класс с виртуальной функцией, производный класс с перегруженной виртуальной функцией базового класса и своей собственное - не виртуальной.
В программе создаются : Объект базового класса, объект производного класса и ссылка на объект базового класса. Вопрос : Как нужно произвести преобразование ссылки (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, я смогу использовать только их виртуальные функции ? -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
klem4 |
![]()
Сообщение
#2
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Кажись разобрался :
Код static void Main(string[] args) { Base B = new Base(); Drived D = new Drived(); Base Ref; Ref = D; Console.WriteLine(((Drived)Ref).noVirtualF()); Console.ReadLine(); } -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
klem4 |
![]()
Сообщение
#3
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
И всетаки это не то. В данном конкретном случае годится, но я видимо привел не верный пример, ситуация такая :
Есть иерархия классов: Точка, Точка -> Окружность, Точка -> Прям. Тругольник, Точка -> Квадрат выглядит она так : Исходный код // 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 =( -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
klem4 |
![]()
Сообщение
#4
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Вот придумал сделать так :
Код 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).Имя_Нужной_Функции } Ура !! -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
![]() ![]() |
![]() |
Текстовая версия | 18.06.2025 16:26 |