public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        IRepository<UserInfo> oo = new User();
        UserInfo info = new UserInfo();
        oo.Insert(info);
    }
}
/// <summary>
/// 实体抽象类
/// </summary>
public abstract class Entity
{}
/// <summary>
/// 用户实体类
/// </summary>
public class UserInfo : Entity
{
    public int ID { get; set; }
    public string Name { get; set; }
}
/// <summary>
/// 员工实体类
/// </summary>
public class EmployeInfo : Entity
{
    public string Code { get; set; }
    public string IdCard { get; set; }
}
/// <summary>
/// 用户 Data Access Object
/// </summary>
public class User : Repository<UserInfo>
{}
/// <summary>
/// Employe Data Access Object
/// </summary>
public class Employe : Repository<EmployeInfo>
{}
/// <summary>
/// 操作仓库类
/// </summary>
/// <typeparam name="T"></typeparam>
public class Repository<T> : IRepository<T> where T : Entity
{    #region IRepository<T> 成员    public T Insert(T info)
    {
        return default(T);
    }    #endregion
}
/// <summary>
/// 操作仓库接口类
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IRepository<T> where T : Entity
{
    T Insert(T info);
}-------------------
以上我是看了NHibernate的示例
自己定的一段代码,
但在用的时候我有一个问题如
这个时候我的User类中我要添加多一个GetName的方法,
这个时候
IRepository<UserInfo> oo = new User();
这样的话就执行不了我的GetName方法
但是如果用
User oo = new User();
这样写的话就发挥不了接口的优势?
好像说没有更好的偶合性还是什么来的?那应该如何来写呢?

解决方案 »

  1.   

    把GetName放到IRepository 接口中 不行吗?
    http://www.mybuffet.cn
      

  2.   

    接口本来就是约束所有实现该接口类的公共行为的如果你只想给User类增加一个行为(GetName方法),而同样实现接口的Employe则不需要这个行为那这个行为就不应该用接口来做约束
    而你要用这个接口类型的引用来引用这些类的实例,那么这些实例则只能访问到接口公开的行为换而言之,不属于接口的共同的公共行为,就不应该用接口类型的引用来访问
    不成问题的问题要用 IRepository <UserInfo> oo来访问实例,部分实例允许拥有GetName行为,而另一部分不允许拥有GetName,这种想法本身违背OOP思想