Можно ли в виртуальном методе базового класса в качестве ...
От:
Аноним
Дата:
17.03.10 14:23
Оценка:
Можно ли в виртуальном методе базового класса в качестве параметра указать тип наследника
public class BaseClass
{
protected virtual void VirtMethod(/*Вот здесь хочу как-то указать тип таким образом, чтобы в наследнике получился типа наследника*/)
{
}
}
public class DerivedClass : BaseClass
{
//Нужно чтобы наследник выглядел такprotected override void VirtMethod(DerivedClass baseObject)
{
}
}
Это можно сделать передавать тип базового класса в виде параметра типа, но как-то не очень так хочется делать. Можно ли по-другому?
Re: Можно ли в виртуальном методе базового класса в качестве
Здравствуйте, Аноним, Вы писали:
А>Это можно сделать передавать тип базового класса в виде параметра типа, но как-то не очень так хочется делать. Можно ли по-другому?
В смысле так не хочется?
public class BaseClass<T>
{
protected virtual void VirtMethod(T obj)
{
}
}
public class DerivedClass : BaseClass<DerivedClass>
{
protected override void VirtMethod(DerivedClass obj)
{
}
}
А вообще как-то странно это все выглядит
Re: Можно ли в виртуальном методе базового класса в качестве
От:
Аноним
Дата:
17.03.10 14:35
Оценка:
public interface IBase
{
void BaseM();
}
public class BaseClass<T> : IBase where T : IBase
{
public void BaseM() {}
protected virtual void VirtMethod(T t)
{
t.BaseM();
}
}
public class DerivedClass : BaseClass<DerivedClass>
{
public void Derived() {}
//Нужно чтобы наследник выглядел такprotected override void VirtMethod(DerivedClass baseObject)
{
baseObject.BaseM();
baseObject.Derived();
}
}
Re: Можно ли в виртуальном методе базового класса в качестве
Здравствуйте, Аноним, Вы писали:
А> Это можно сделать передавать тип базового класса в виде параметра типа, но как-то не очень так хочется делать. Можно ли по-другому?
А что должно будет произойти, если:
class OtherDerived : BaseClass { }
BaseClass a = new Derived();
a.VirtMethod(new OtherDerived());
В C++ есть поддержка ковариантности в указании типа возвращаемого значения при переопределении виртуального метода. В C# оного нету. Только в случае возвращаемого значения можно безопасно сменить тип на производный (причём, насколько я помню, сменить можно только на тип класса, в котором метод переопределяется).
Приведённый Вами сценарий потребовал бы проверок времени выполнения и на самом деле не имеет смысла. Пересмотрите архитектуру.
Re[2]: Можно ли в виртуальном методе базового класса в качес
Здравствуйте, Аноним, Вы писали:
А> Это можно сделать передавать тип базового класса в виде параметра типа, но как-то не очень так хочется делать. Можно ли по-другому?
Что мешает так:
class Base
{
protected virtual void Method(Derived item) {
}
}
class Derived : Base
{
protected sealed override void Method(Derived item) {
}
}
Все равно какая-то бедовая хотелка. Что нужно сделать-то?
Re[2]: Можно ли в виртуальном методе базового класса в качес
От:
Аноним
Дата:
17.03.10 15:29
Оценка:
Здравствуйте, Пельмешко, Вы писали:
П>Здравствуйте, Аноним, Вы писали:
А>> Это можно сделать передавать тип базового класса в виде параметра типа, но как-то не очень так хочется делать. Можно ли по-другому?
П>А что должно будет произойти, если: П>
П>class OtherDerived : BaseClass { }
П>BaseClass a = new Derived();
П>a.VirtMethod(new OtherDerived());
П>
П>В C++ есть поддержка ковариантности в указании типа возвращаемого значения при переопределении виртуального метода. В C# оного нету. Только в случае возвращаемого значения можно безопасно сменить тип на производный (причём, насколько я помню, сменить можно только на тип класса, в котором метод переопределяется).
П>Приведённый Вами сценарий потребовал бы проверок времени выполнения и на самом деле не имеет смысла. Пересмотрите архитектуру.
Благодаря приведенному примеру понял, почему нету именно такой возможности. Спасибо.