IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Классы.Наследование, С#
сообщение
Сообщение #1


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Есть базовый класс с виртуальной функцией, производный класс с перегруженной виртуальной функцией базового класса и своей собственное - не виртуальной.

В программе создаются : Объект базового класса, объект производного класса и ссылка на объект базового класса.

Вопрос : Как нужно произвести преобразование ссылки (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";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Кажись разобрался :

Код

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";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


И всетаки это не то. В данном конкретном случае годится, но я видимо привел не верный пример, ситуация такая :

Есть иерархия классов: Точка, Точка -> Окружность, Точка -> Прям. Тругольник, Точка -> Квадрат

выглядит она так :

Исходный код
// 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";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Вот придумал сделать так :

Код
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).Имя_Нужной_Функции
}


Ура !!


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 13.10.2024 21:22
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name