2012-04-19 53 views
3

在MVC项目中,我有以下类:传承和“奇异递归模板模式”

public abstract class Browse<T> where T : Browse<T> 

public abstract class SqlBrowse<T> : Browse<T> where T : Browse<T> 

public class SqlBrowseBoys : SqlBrowse<SqlBrowseBoys> 
public class SqlBrowseGirls : SqlBrowse<SqlBrowseGirls> 

及以下视图模型

public class BrowseViewModel 
{ 
    public [INTERFACE] People { get; set; } 
} 

但我需要在一个接口/类标记为[INTERFACE]的位置可以同时使用SqlBrowseBoys和SqlBrowseGirls,因此我可以在多个位置使用BrowseViewModel。

我很喜欢它,如果有人能告诉我,我的大脑现在如何打结。我怀疑这需要对类进行一些更改,这很好,但我目前不知道那会是什么。

很多很多,谢谢。

+1

Eric Lippert发布​​了关于Curiously Recurring Template Pattern [这里](http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx),这应该是很有帮助。 – 2012-04-19 05:23:20

+0

是的,这就是在搜索到上面的代码后,我学习了模式的名称和关于它的一些信息,但是这对我目前的问题没有帮助。不过谢谢。 – Bobbler 2012-04-19 05:32:27

回答

3

SqlBrowse<T>实行非通用SqlBrowse接口(或抽象类),然后写

public SqlBrowse People { get; set; } 

这是很难说什么样的变化,这将意味着你的类,因为我们没有自己的定义。

+0

当我这样做时,它坚持认为SqlBrowseBoys和SqlBrowseGirls也实现了新的界面,然后我解决了另一个连锁效应,然后另一个......很难描述所有没有过多的代码。还有其他建议吗? – Bobbler 2012-04-19 06:01:54

+1

@马克这可能是因为你写 “类SqlBrowse :浏览其中T:浏览,SqlBrowse {}” 时,你应该写 “类SqlBrowse :浏览,SqlBrowse其中T:浏览 {}” – Asik 2012-04-19 06:09:02

+0

是的,我做到了!谢谢。我仍然有对付的连锁效应,但不是那么多,phew。 – Bobbler 2012-04-19 22:15:04