泛型类继承问题?

时间:2021-04-27 19:21:08
    public class DataEngine
    {

        private IBase<Sys_User> bbuser;
        private Sys_User model;

        public Sys_User Model
        {
            get { return model; }
            set { model = value; }
        }

        public IBase<Sys_User> Bbuser
        {
            get { return bbuser; }
        }

        public DataEngine()
        {
             bbuser = new BaseDb<Sys_User>();
             model =bbuser.CreateEntity();
        }

    }
源码如上:
我想把这个类改成通用类,如何才能实现下面的型式?
 public class DataEngine<T>
    {

        private IBase<T> bbuser;
        private T model;

        public T Model
        {
            get { return model; }
            set { model = value; }
        }

        public IBase<T> Bbuser
        {
            get { return bbuser; }
        }

        public DataEngine()
        {
             bbuser = new BaseDb<T>();
             model =bbuser.CreateEntity();
        }

    }



15 个解决方案

#1


 public class DataEngine<T>
  where T:class
  {

  private IBase<T> bbuser;
  private T model;

  public T Model
  {
  get { return model; }
  set { model = value; }
  }

  public IBase<T> Bbuser
  {
  get { return bbuser; }
  }

  public DataEngine()
  {
  bbuser = new BaseDb<T>();
  model =bbuser.CreateEntity();
  }

  }

在红色部分加上应有的条件限制

#2


该回复于2011-04-07 11:24:57被版主删除

#3


加泛型约束
public class DataEngine<T> where T:class, new()
class表示 T类型是一个类
new()表示T必须具备无参构造函数,如果用到了T实例化 T t = new T(); 则必须要有这个约束
同时这个约束必须放在最后面

#4


没错
引用 3 楼 dongxinxi 的回复:
加泛型约束
public class DataEngine<T> where T:class, new()
class表示 T类型是一个类
new()表示T必须具备无参构造函数,如果用到了T实例化 T t = new T(); 则必须要有这个约束
同时这个约束必须放在最后面

#5


 public class DataEngine<T> where T : class,new()
    {

        private IBase<T> bbuser;
        private T model;

        public T Model
        {
            get { return model; }
            set { model = value; }
        }

        public IBase<T> Bbuser
        {
            get { return bbuser; }
        }

        public DataEngine()
        {
            bbuser = new BaseDb<T>();
            model = bbuser.CreateEntity();
        }

    }


这样都提示不能错误:
不能将类型“T”用作泛型类型或方法“Mynet.DAL.BaseDb<T>”中的类型形参“T”。没有从“T”到“Mynet.DAL.Imodel”的隐式引用转换

也就是说IBase<T>转成新的类

#6


public class DataEngine<T> where T : class,new(),Imodel

#7


谢谢,不过我后面引用DataEngine<俱体实体类> sd;会报下面的错误:
错误 1 类型“Mynet.DAL.Sys_User”同时存在于“c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\web\d2576897\f8b7b1a8\assembly\dl3\9719319c\000280ee_44f0cb01\DAL.DLL”和“c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\web\d2576897\f8b7b1a8\assembly\dl3\f1df6cfd\0072d527_18f1cb01\Mynet.DAL.DLL”中 D:\Lfy\Mynet\Web\Default.aspx.cs 22 16 D:\...\Web\

也就是说Imodel放到这里会重复生成两个实例啊,不知道乍么办

#8


昏死。那是程序集的问题~~~你加上命名空间限制下

#9


引用 8 楼 cj205 的回复:
昏死。那是程序集的问题~~~你加上命名空间限制下
不是吧我不用这种泛型没问题的啊。命名空间没关系的啊

#10


该回复于2011-04-07 15:11:19被版主删除

#11


泛型类继承问题?

#12


该回复于2011-04-07 15:17:43被版主删除

#13


该回复于2011-04-07 15:26:31被版主删除

#14


该回复于2011-04-07 16:18:22被版主删除

#15


反了没人回

#1


 public class DataEngine<T>
  where T:class
  {

  private IBase<T> bbuser;
  private T model;

  public T Model
  {
  get { return model; }
  set { model = value; }
  }

  public IBase<T> Bbuser
  {
  get { return bbuser; }
  }

  public DataEngine()
  {
  bbuser = new BaseDb<T>();
  model =bbuser.CreateEntity();
  }

  }

在红色部分加上应有的条件限制

#2


该回复于2011-04-07 11:24:57被版主删除

#3


加泛型约束
public class DataEngine<T> where T:class, new()
class表示 T类型是一个类
new()表示T必须具备无参构造函数,如果用到了T实例化 T t = new T(); 则必须要有这个约束
同时这个约束必须放在最后面

#4


没错
引用 3 楼 dongxinxi 的回复:
加泛型约束
public class DataEngine<T> where T:class, new()
class表示 T类型是一个类
new()表示T必须具备无参构造函数,如果用到了T实例化 T t = new T(); 则必须要有这个约束
同时这个约束必须放在最后面

#5


 public class DataEngine<T> where T : class,new()
    {

        private IBase<T> bbuser;
        private T model;

        public T Model
        {
            get { return model; }
            set { model = value; }
        }

        public IBase<T> Bbuser
        {
            get { return bbuser; }
        }

        public DataEngine()
        {
            bbuser = new BaseDb<T>();
            model = bbuser.CreateEntity();
        }

    }


这样都提示不能错误:
不能将类型“T”用作泛型类型或方法“Mynet.DAL.BaseDb<T>”中的类型形参“T”。没有从“T”到“Mynet.DAL.Imodel”的隐式引用转换

也就是说IBase<T>转成新的类

#6


public class DataEngine<T> where T : class,new(),Imodel

#7


谢谢,不过我后面引用DataEngine<俱体实体类> sd;会报下面的错误:
错误 1 类型“Mynet.DAL.Sys_User”同时存在于“c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\web\d2576897\f8b7b1a8\assembly\dl3\9719319c\000280ee_44f0cb01\DAL.DLL”和“c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\web\d2576897\f8b7b1a8\assembly\dl3\f1df6cfd\0072d527_18f1cb01\Mynet.DAL.DLL”中 D:\Lfy\Mynet\Web\Default.aspx.cs 22 16 D:\...\Web\

也就是说Imodel放到这里会重复生成两个实例啊,不知道乍么办

#8


昏死。那是程序集的问题~~~你加上命名空间限制下

#9


引用 8 楼 cj205 的回复:
昏死。那是程序集的问题~~~你加上命名空间限制下
不是吧我不用这种泛型没问题的啊。命名空间没关系的啊

#10


该回复于2011-04-07 15:11:19被版主删除

#11


泛型类继承问题?

#12


该回复于2011-04-07 15:17:43被版主删除

#13


该回复于2011-04-07 15:26:31被版主删除

#14


该回复于2011-04-07 16:18:22被版主删除

#15


反了没人回