【发布时间】:2017-01-21 18:06:41
【问题描述】:
也许不是最准确的标题,但描述起来有点困难;也许你们可以在这里帮助我?我正在使用 MVC 格式编写游戏,并且我希望每个基类(控制器、模型和视图)都有对其随附功能的引用,形成一种三角形(即模型具有对控制器的引用定义它,以及引用它的视图等)这些类中的大部分看起来像这样:
public class Model {
public Controller controller;
public View view;
public void Connect (Controller controller, View view) {
this.controller = controller;
this.view = view;
}
}
这没关系,但每当我打算调出 ChildModel 的控制器时,我都需要强制转换为适当的 ChildController 以获得正确的版本。我可以创建一个实用方法/getter 来获取适当的强制转换项,但我不想为每个子类重写这段代码。我以为我可以通过使基类通用来解决这个问题,但现在我遇到了一个问题,即新的通用类需要引用试图定义它们的类,因此:
public class Model<V, C> where V : View<?, C> where C : Controller<?, V> {
public Controller<?, V> controller;
public View<?, C> view;
public void Connect (Controller<?, V> controller, View<?, C> view) {
this.controller = controller;
this.view = view;
}
}
如您所见,这很快在基类中变得一团糟。我不知道为试图定义约束的模型放置什么符号(参考上面的示例)。将“模型”放入问号似乎也无法编译,因为我遇到了地狱般的拳击转换问题。
有没有办法完成我所追求的,或者我只是想在这里太聪明了?如果这可行,我希望能够声明类型限制为“三角形”的子类,因此我可以避免不必要的强制转换或辅助方法:
public class ChildModel<ChildView, ChildController> {
public ChildModel () {
this.controller <- calls ChildController type, not base type!
}
}
有人有什么想法吗?
【问题讨论】:
标签: c# generics model-view-controller unity3d