Можно ли в виртуальном методе базового класса в качестве ...
От: Аноним  
Дата: 17.03.10 14:23
Оценка:
Можно ли в виртуальном методе базового класса в качестве параметра указать тип наследника


public class BaseClass
{

protected virtual void VirtMethod(/*Вот здесь хочу как-то указать тип таким образом, чтобы в наследнике получился типа наследника*/)
{
}

}

public class DerivedClass : BaseClass
{

//Нужно чтобы наследник выглядел так
protected override void VirtMethod(DerivedClass baseObject)
{
}

}


Это можно сделать передавать тип базового класса в виде параметра типа, но как-то не очень так хочется делать. Можно ли по-другому?
Re: Можно ли в виртуальном методе базового класса в качестве
От: _FRED_ Черногория
Дата: 17.03.10 14:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Можно ли в виртуальном методе базового класса в качестве параметра указать тип наследника


Например, как-то так:

  class Base
  {
    protected virtual void Method(Base item) {
    }
  }

  class Derived : Base
  {
    protected virtual void Method(Derived item) {
    }

    protected sealed override void Method(Base item) {
      Method((Derived)item);
    }
  }


А>//Нужно чтобы наследник выглядел так


Для чего?
Help will always be given at Hogwarts to those who ask for it.
Re: Можно ли в виртуальном методе базового класса в качестве
От: Воронков Василий Россия  
Дата: 17.03.10 14:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Это можно сделать передавать тип базового класса в виде параметра типа, но как-то не очень так хочется делать. Можно ли по-другому?


В смысле так не хочется?

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: Можно ли в виртуальном методе базового класса в качестве
От: Пельмешко Россия blog
Дата: 17.03.10 14:37
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Это можно сделать передавать тип базового класса в виде параметра типа, но как-то не очень так хочется делать. Можно ли по-другому?


А что должно будет произойти, если:
class OtherDerived : BaseClass { }

BaseClass a = new Derived();
a.VirtMethod(new OtherDerived());


В C++ есть поддержка ковариантности в указании типа возвращаемого значения при переопределении виртуального метода. В C# оного нету. Только в случае возвращаемого значения можно безопасно сменить тип на производный (причём, насколько я помню, сменить можно только на тип класса, в котором метод переопределяется).

Приведённый Вами сценарий потребовал бы проверок времени выполнения и на самом деле не имеет смысла. Пересмотрите архитектуру.
Re[2]: Можно ли в виртуальном методе базового класса в качес
От: Пельмешко Россия blog
Дата: 17.03.10 14:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>public interface IBase ...
А>public class BaseClass<T> : IBase where T : IBase ...
А>


В base class constraint можно и на самого себя сослаться
public class BaseClass<T> where T : BaseClass<T>
{
    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: Можно ли в виртуальном методе базового класса в качестве
От: samius Япония http://sams-tricks.blogspot.com
Дата: 17.03.10 14:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Это можно сделать передавать тип базового класса в виде параметра типа, но как-то не очень так хочется делать. Можно ли по-другому?


Что мешает так:

  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# оного нету. Только в случае возвращаемого значения можно безопасно сменить тип на производный (причём, насколько я помню, сменить можно только на тип класса, в котором метод переопределяется).


П>Приведённый Вами сценарий потребовал бы проверок времени выполнения и на самом деле не имеет смысла. Пересмотрите архитектуру.


Благодаря приведенному примеру понял, почему нету именно такой возможности. Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.