Как разрулить такое наследование C#
От: v_0ver Россия  
Дата: 27.10.14 08:24
Оценка:
class A;
class B:A;

class Fork<T> where T: A;
class Equip: Fork<B>;

public Fork<A> GetElement()
{
    return new Equip(B_Obj);
}

Ругается в GetElement() мол не может привести типы, возможно ли осуществить такое наследование?
c# generic наследование
Re: Как разрулить такое наследование C#
От: ZagSer168 Ниоткуда https://x.u168.ru
Дата: 27.10.14 08:52
Оценка:
Нельзя. Ковариантность/контрвариатнность для классов не поддерживается.
Можно ввести интерфейсы, если это не противоречит задаче.
Одиночное наследование — это всего лишь частный случай множественного наследования.
Re[2]: Как разрулить такое наследование C#
От: v_0ver Россия  
Дата: 27.10.14 09:04
Оценка:
Здравствуйте, ZagSer168, Вы писали:

ZS>Нельзя. Ковариантность/контрвариатнность для классов не поддерживается.

ZS>Можно ввести интерфейсы, если это не противоречит задаче.

interface IFork{}

class A { }
class B : A { }

class Fork<T> : IFork where T : A { }
class Equip : Fork<B> { }

public IFork GetElement()
{
    return new Equip();
}

Сейчас оно как раз так и реализовано, просто думал, что возможно, я что то упускаю, и можно обойтись без интерфейса. Спасибо.
Re[3]: Как разрулить такое наследование C#
От: Jack128  
Дата: 27.10.14 09:08
Оценка:
Здравствуйте, v_0ver, Вы писали:

_>Здравствуйте, ZagSer168, Вы писали:


ZS>>Нельзя. Ковариантность/контрвариатнность для классов не поддерживается.

ZS>>Можно ввести интерфейсы, если это не противоречит задаче.

_>
_>interface IFork{}

_>class A { }
_>class B : A { }

_>class Fork<T> : IFork where T : A { }
_>class Equip : Fork<B> { }

_>public IFork GetElement()
_>{
_>    return new Equip();
_>}
_>

_>Сейчас оно как раз так и реализовано, просто думал, что возможно, я что то упускаю, и можно обойтись без интерфейса. Спасибо.
что то твой код не эквивалентен исходному, который в первом посте был. Тут у тя нет ковариантности.
Под вводом интерфейса имеется в виду что то типа такого:


class A;
class B:A;

interface IFork<T> where T: A;
class Fork<T>: IFork<T>;
class Equip: Fork<B>;

public IFork<A> GetElement()
{
    return new Equip(B_Obj);
}
Re[4]: Как разрулить такое наследование C#
От: v_0ver Россия  
Дата: 27.10.14 09:40
Оценка:
Здравствуйте, Jack128, Вы писали:
J>
...
J>interface IFork<T> where T: A;
...
J>

interface IFork<out T> where T: A;

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