我正在尝试创建两个接口层次结构,一个用于业务模型对象,一个用于 ui。我知道在层之间保持松散耦合很重要,但应用程序的一部分将需要绘制图表,因此我需要模型对象可以随时用于其相应的图形表示,并且我有一个公共层持有模型对象的接口..
常用类库代码:
public interface IBase {}
public interface IBookObject : IBase {}
public interface ITapeObject : IBase {}
public class Book : IBookObject {}
图形层代码:
public interface IModelObject<T>
{
T ModelObject { get; set; } // might be a book or tape , etc
}
public class GraphicObject<T> : IModelObject<T>
{
public T ModelObject { get; set; }
}
代码使用:
IBookObject bk = new Book();
var go = new GraphicObject<IBookObject>(); // will fail later
//var go = new GraphicObject<IBase>(); // will succeed later
go.ModelObject = bk;
if (go is IModelObject<IBase>) // can't use is IModelObject<IBookObject>
// as go might be GraphicObject<ITapeObject>
{
Debug.WriteLine("Success");
}
因此,如果我想测试 IBase(然后访问 ModelObject),我必须确保原始对象是使用 IBase 而不是派生接口创建的,这似乎是后来出现错误的原因。我的问题是:
1)我在做一些可怕的事情吗?!:) 我可能忽略了一个更好的方法..
2) 做不到这一点,是否有某种方法可以使用新的逆变 c# 4 技术对从 IBase 派生的任何接口进行 is line 测试?或者,我认为如果 IBook 不从 IBase 继承它会起作用,但是 Book(和 Tape)分别实现了 IBook 和 IBase。
3)如果做不到这一点,有什么方法可以防止构建GraphicObject<IBookObject>()
and GraphicObject<ITapeObject>()
?
谢谢!