【问题标题】:Inheritance and the 'Curiously Recurring Template Pattern'继承和“奇怪重复的模板模式”
【发布时间】:2023-09-08 10:40:01
【问题描述】:

在 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。

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

非常感谢。

【问题讨论】:

  • Eric Lippert 发布了关于奇怪重复出现的模板模式 here,这应该会有所帮助。
  • 是的,这就是我在搜索上述代码后了解到模式的名称及其相关信息的地方,但这对我当前的问题没有帮助。不过还是谢谢。

标签: c# generics inheritance polymorphism


【解决方案1】:

SqlBrowse&lt;T&gt;实现一个非泛型SqlBrowse接口(或抽象类),然后编写

public SqlBrowse People { get; set; }

由于我们没有它们的定义,因此很难说这将对您的课程带来哪些变化。

【讨论】:

  • 当我这样做时,它坚持 SqlBrowseBoys 和 SqlBrowseGirls 也实现了新接口,然后我解决了另一个连锁效应,然后是另一个......如果不发布大量代码,很难描述所有这些。还有其他建议吗?
  • @Mark 这可能是因为你写了 "class SqlBrowse : Browse where T : Browse, SqlBrowse { }" 当你应该写 "class SqlBrowse : Browse, SqlBrowse where T : Browse { }"
  • 是的,我做到了!谢谢。我还有连锁反应要处理,但没有那么多,唷。