繁体   English   中英

键入通用接口

[英]Typing generic interfaces

我正在尝试创建两个接口层次结构,一个用于业务模型对象,一个用于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的任何接口进行线路测试? 另外,我认为如果IBook不继承自IBase,但Book(和Tape)分别实现IBook和IBase,那将是可行的。

3)失败了,有什么办法可以防止GraphicObject<IBookObject>()GraphicObject<ITapeObject>()

谢谢!

这行得通吗?

public interface IBase { }
public interface IBookObject : IBase { }
public interface ITapeObject : IBase { }

public class Book : IBookObject { }

public interface IModelObject
{
    IBase ModelObject { get; set; } // might be a book or tape , etc
}


public class GraphicObject<T> : IModelObject
    where T: class, IBase
{
    public T ModelObject { get; set; }

    #region IModelObject Members

    IBase IModelObject.ModelObject
    {
        get
        {
            return ModelObject;
        }
        set
        {
            ModelObject=value as T;
        }
    }

    #endregion
}

class Program
{
    static void Main(string[] args)
    {
        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) // can't use is IModelObject<IBookObject> as go might be GraphicObject<ITapeObject>
        {
            Debug.WriteLine("Success");
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM