【发布时间】:2017-10-24 11:03:54
【问题描述】:
目前,我面临一个通用接口继承问题:
interface IParent<T> {
R Accept<R>(IParentVisitor<T, R> visitor);
}
interface IChild<T, TKey> : IParent<T> {
R Accept<R>(IChildVisitor<T, TKey, R> visitor);
}
我还创建了这些Visitor 接口:
interface IParentVisitor<T, R> {
R Visit(IParent<T> parent);
}
interface IChildVisitor<T, TKey, R> : IParentVisitor<T, R> {
R Visit(IChild<T, TKey> viz);
}
实现:
class ParentVisitor<T> : IParentVisitor<T, MyResultClass> {
MyResultClass Visit(IParent<T> parent) {
return //...;
}
}
class ChildVisitor<T, TKey> : IChildVisitor<T, TKey, MyAnotherResultClass> {
MyAnotherResultClass Visit(IChild<T, TKey> child) {
return //...;
}
}
到目前为止,一切似乎都是正确的。不过,猜猜这种情况:
static void Main() {
IList<IParent<MyT>> interfaces = new List<IParent<MyT>>();
interfaces.add(new Parent<MyT>());
interfaces.add(new Child<MyT, string>());
interfaces.add(new Child<MyT, int>());
interfaces.add(new Child<MyT, TimeSpan>());
//...
//(!!*!!)
foreach (IChild<MyT, string> stringChild in interfaces.OfType<IChild<MyT, string>()) {
ChildVisitor stringChildVisitor = new ChildVisitor<MyT, string>();
var result = stringChild.Accept(stringChildVisitor);
//...
}
//(!!*!!)
foreach (IChild<MyT, int> intChild in interfaces.OfType<IChild<MyT, int>()) {
ChildVisitor intChildVisitor = new ChildVisitor<MyT, int>();
var result = stringChild.Accept(intChildVisitor);
//...
}
//and so on up to infitiny types in C#...
}
我认为这是获得我想要的东西的一种不可行的方式。
我想要得到的是在IChild<T, *> 上使用ChildVisitor,其中* 是任何类型。不知道我解释的好不好。
类似的东西:
//(!!*!!)
foreach (IChild<MyT, *> asterisckChild in interfaces.OfType<IChild<MyT, *>()) {
ChildVisitor asterisckChildVisitor = new ChildVisitor<MyT, *>();
var result = asterisckChild.Accept(asterisckChildVisitor);
//...
}
有什么想法吗?
【问题讨论】:
-
在
ChildVisitor中接受孩子时,您真的关心TKey是什么吗? -
我想你的意思是,如果
TKey用于ChildVisitor.Visit实现?是的。 -
反思可以提供帮助,但你真的想走这条路吗?
foreach(var it in interfaces) foreach(var face in it.GetType().GetInterfaces()) if(typeof(IChild<,>).IsAssignableFrom......不确定最后一个,但写起来会很恐怖 -
我认为我使用了一种非最佳实践的方法来设计这种行为......但是,我不太清楚如何得到它......
-
@firda 你能给我一个答案,提供一些关于你的方法的额外帮助代码吗?
标签: c# .net generics design-patterns visitor-pattern