Перегрузка методов при работе с иерархией классов
От: defascat  
Дата: 04.08.04 10:18
Оценка:
Добрый день!!!
В MSDN и на форумах я не нашел рассказа о данной ситуации, может быть Вы
мне поможете. Спасибо.

class A {}

class B : A {}

class C
{
    public virtual void Method(A a);
    public virtual void Method(B b);

// Если передается тип A - вызывается правильный метод Method(A a)
// Если передается тип B - вызывается по прежнему метод Method(A a)
// А нужно чтоб вызывался Method(B b)! Как это сделать?
// Явное приведение типов вроде Method((B)obj); не устраивает, так как пронаследованных 
// классов - куча

    void Work(Type type)
    {
        A obj = (A)Activator.CreateInstance(type);
        Method(obj);
    }
}
Re: Перегрузка методов при работе с иерархией классов
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 04.08.04 10:39
Оценка: +1
Здравствуйте, defascat, Вы писали:

D>// Если передается тип A — вызывается правильный метод Method(A a)

D>// Если передается тип B — вызывается по прежнему метод Method(A a)
D>// А нужно чтоб вызывался Method(B b)! Как это сделать?
D>// Явное приведение типов вроде Method((B)obj); не устраивает, так как пронаследованных
D>// классов — куча

D> void Work(Type type)

D> {
D> A obj = (A)Activator.CreateInstance(type);
D> Method(obj);
D> }
D>}

Выбор перегруженного метода осуществляется компилятором при компиляции. С полиморфизмом это не стыкуется.
... << RSDN@Home 1.1.4 beta 2 >>
AVK Blog
Re: Перегрузка методов при работе с иерархией классов
От: Pavel Kalyakin http://www.livejournal.com/users/pavelk/
Дата: 04.08.04 10:43
Оценка:
Здравствуйте, defascat, Вы писали:

D>
D>class A {}
D>class B : A {}
D>class C
D>{
D>    public virtual void Method(A a);
D>    public virtual void Method(B b);

D>// Если передается тип A - вызывается правильный метод Method(A a)
D>// Если передается тип B - вызывается по прежнему метод Method(A a)
D>// А нужно чтоб вызывался Method(B b)! Как это сделать?
D>// Явное приведение типов вроде Method((B)obj); не устраивает, так как пронаследованных 
D>// классов - куча

D>    void Work(Type type)
D>    {
D>        A obj = (A)Activator.CreateInstance(type);
D>        Method(obj);
D>    }
D>}
D>

Хороший вопрос.
<offtopic>
Я подобное на собеседовании люблю спрашивать
class A {}
class B : A {}

void test(A a )
{
  if ( a is A )
        Console.Writeline("it's A!");
    else if ( a is B )
        Console.Writeline("it's B!");
}

B b = new B();
A a = new A();
test( a );
test( b );


Что будет выведено?
</offtopic>

По существу:
Я бы сделал интерфейс и дергал бы его у созданного экземпляра.
... << Rsdn@Home 1.1.4 beta 1 >>
Павел Калякин, MCDS.NET, MCS
http://www.livejournal.com/users/pavelk — Мой блог
Re: Перегрузка методов при работе с иерархией классов
От: defascat  
Дата: 04.08.04 10:49
Оценка:
Огромное Вам спасибо за помощь.
Придется действительно делать через интерфейс...
Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.