关于泛型类使用工厂模式的问题

vinqon 2010-03-26 01:31:54
我写了一个泛型类,大致如下:

public class BaseDAL<T> where T : BaseModel, new()
{
int Add(T model){...}
int Update(T model){...}
int Delete(T model){...}
}


然后我想写一个工厂,用来返回
new BaseDAL<News>()
new BaseDAL<Photo>()
...

但是这里需要先写一个接口,我不太清楚应该怎么写,是应该写一个让实体类继承的接口IModel,使用BaseDAL<IModel>声明工厂的返回对象,还是写一个IBaseDAL<>,如果这样,尖括号里面写什么?还是两者都需要?
请大家赐教。


...全文
516 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jshi123 2010-03-26
  • 打赏
  • 举报
回复
那就不必用泛型了,定义一个DAL接口就足够了

public interface IDAL
{
int Add();
int Update();
int Delete();
}


News,Photo都实现这个接口:

public class NewsDAL : IDAL
{
}

public class PhotoDAL : IDAL
{
}


工厂里新建相应类就可以了:
class factory
{
public static IDAL GetDAL(string category)
{
switch (category)
{
case "news": return new NewsDAL(); break;
case "photo": return new PhotoDAL(); break;
......

}
}
}

vinqon 2010-03-26
  • 打赏
  • 举报
回复
非常感谢大家帮我解疑,但小弟不才,还有个问题想请教。
[Quote=引用 1 楼 jshi123 的回复:]
调用时可通过接口:
IBaseDAL<News> newsDAL = factory.GetDAL<News>();
newDAL.Add(xxx);
[/Quote]

其实这里我希望调用的时候是动态的,我在考虑是否需要再写一个实体类的接口。
具体说一下
因为是动态调用,所以声明部分:
IBaseDAL<News> newsDAL这里不能确定是News还是photo,抑或其他。
我主要是这里不知道怎么办。

而在工厂方面,我打算是一个方法,通过传进一个category参数,返回相应的实例。
class factory{
public static IBaseDAL<?> GetDAL(string category)
switch(category){
case "news":return new BaseDAL<News>();break;
case "news":return new BaseDAL<Photo>();break;
……
}
}
这里同样的问题,如果动态的话,返回类型是什么,是否需要再写一个IModel类,如果要写,是应该让BaseModel继承还是各个实体类继承,仍不解。
  • 打赏
  • 举报
回复
[Quote=引用楼主 vinqon 的回复:]
然后我想写一个工厂,用来返回
new BaseDAL<News>()
new BaseDAL<Photo>()[/Quote]

从你的描述看不出半点必要。什么是工厂?为什么要写?把时间和精力用在直接new BaseDAL<News>()上有什么不可以?

看不出有什么必要写,就不要空洞地消磨时间去写。等你需要了,自然就能在提问时把为什么要工厂解释给我们听。
諾临風 2010-03-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jshi123 的回复:]
写一个泛型接口

C# code

public interface IBaseDAL<T> where T : BaseModel, new()
{
int Add(T model);
int Update(T model);
int Delete(T model);
}


让后让泛类BaseDAL实现接口:
public class Base……
[/Quote]

这样处理的优势是什么啊???????
feegle_develop 2010-03-26
  • 打赏
  • 举报
回复
说错了,是一楼的,呵呵
feegle_develop 2010-03-26
  • 打赏
  • 举报
回复
UP二楼的
随风落梦 2010-03-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jshi123 的回复:]
写一个泛型接口

C# code

public interface IBaseDAL<T> where T : BaseModel, new()
{
int Add(T model);
int Update(T model);
int Delete(T model);
}


让后让泛类BaseDAL实现接口:
public class BaseDAL<T> : IBaseDAL<T> where T : BaseModel, new()

工厂也应该是泛方法,返回IBaseDAL:
public IBaseDAL<T> GetDAL<T>() where T : Default2, new()
{
return new BaseDal<T>();
}

调用时可通过接口:
IBaseDAL<News> newsDAL = factory.GetDAL<News>();
newDAL.Add(xxx);
[/Quote]
不错,学习了!
sxiaohui8709253 2010-03-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jshi123 的回复:]
写一个泛型接口

C# code

public interface IBaseDAL<T> where T : BaseModel, new()
{
int Add(T model);
int Update(T model);
int Delete(T model);
}


让后让泛类BaseDAL实现接口:
public class Base……
[/Quote]

学习了
jshi123 2010-03-26
  • 打赏
  • 举报
回复
写一个泛型接口

public interface IBaseDAL<T> where T : BaseModel, new()
{
int Add(T model);
int Update(T model);
int Delete(T model);
}

让后让泛类BaseDAL实现接口:
public class BaseDAL<T> : IBaseDAL<T> where T : BaseModel, new()

工厂也应该是泛方法,返回IBaseDAL:
public IBaseDAL<T> GetDAL<T>() where T : Default2, new()
{
return new BaseDal<T>();
}

调用时可通过接口:
IBaseDAL<News> newsDAL = factory.GetDAL<News>();
newDAL.Add(xxx);

jshi123 2010-03-26
  • 打赏
  • 举报
回复
class factory
{
public static IBaseDAL<BaseModel> GetDAL(string category)
{
switch (category)
{
case "news": return new BaseDAL<News>(); break;
case "news": return new BaseDAL<Photo>(); break;
}
}
}
fskang 2010-03-26
  • 打赏
  • 举报
回复
没看明白。你是不是这个意思啊?


class factory{
public static IBaseDAL<T> GetDAL<T>(){
if(typeof(T)==typeof(News)){
return (IBaseDAL<T>)new BaseDAL<News>();
}else if (typeof(T)==typeof(Photo)){
return (IBaseDAL<T>)new BaseDAL<Photo>();
}
return null;
}
}
jshi123 2010-03-26
  • 打赏
  • 举报
回复
可以让工厂方法返回类型为BaseModel的泛型接口
class factory{
public static IBaseDAL<BaseModel> GetDAL(string category) {
switch(category){
case "news":return new BaseDAL<News>();break;
case "news":return new BaseDAL<Photo>();break;
……
}
}
不过建议你还是改下结构,否则结构比较乱,使用起来也不方便
vinqon 2010-03-26
  • 打赏
  • 举报
回复
谢谢jshi123兄的帮助。
你的方法的确可以。
但是我好不容易把这些DAL们用泛型给抽象了,我不太想为了使用工厂又得把他们拆出来,还有没有其他方法呢?

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧