Разница в структуре дерева интерфейса

79
4

Я изо всех сил пытаюсь внедрить структуру иерархии дерева ниже, является примером структуры иерархии классов. Я бы очень признателен, если кто-то может указать мне в правильном направлении.

Я не могу

var myobj2 = (IR<JB>)JR;

Классы:

public class BASEA{ }
public class B: BASEA{ }
public class C: B{ }

public interface IR<T> { }

public abstract class JR<T> : IR<T> where T : B
{ public abstract void SetRule(); }

public class Action: JB<C>
{
public override void SetRule()
{
//Logic
}
}

public static class RuleLib
{

public static void ApplyTest<T>(T obj, IR<T> JB) where T:B
{
var myobj2 = (IR<JB>)JR; //=> does not cast!
}
}
public class Test
{
[Test]
public void demo()
{
var obj = new B();
var action = new Action();
RuleLib.ApplyRule(obj,action);
}
}

спросил(а) 2015-06-27T00:08:00+03:00 5 лет, 3 месяца назад
1
Решение
91

Чтобы это работало, ваш IRule интерфейс должен быть ковариантным. Приведенный здесь пример показывает следующую ковариацию:

IEnumerable<Derived> d = new List<Derived>();
IEnumerable<Base> b = d;

Это в основном то, что вы делаете. Поэтому в вашем коде все, что вам нужно сделать, это написать

public interface IRule<out T> { ... }

вместо

public interface IRule<T> { ... }

Это делает так, что вы можете отбрасывать из IRule<U> в IRule<V> где U является подклассом V (например, литье из IRule<ShiftAction> в IRule<Job>)).

ответил(а) 2015-06-27T00:24:00+03:00 5 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема