Разница в структуре дерева интерфейса
Я изо всех сил пытаюсь внедрить структуру иерархии дерева ниже, является примером структуры иерархии классов. Я бы очень признателен, если кто-то может указать мне в правильном направлении.
Я не могу
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);
}
}
Чтобы это работало, ваш 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>
)).
- Вопросы
- Covariance
- Разница в структуре дерева интерфейса