在开始之前,我想表明我意识到这不是理想的做法。但是,调用类不能根据赋值规则进行更改。我试图理解并找到解决这个问题的方法,但我没有运气。
下面有1个超类,TreeMangement(这些子类只能有1个超类)。有3个子类(苹果,橙子和香蕉)。 “find”方法必须位于TreeMangement超类中。我不允许覆盖“查找”方法。使用当前代码,我将在调用类中得到一个转换错误。它将声明TreeMangement不会被隐含到AppleTree,OrangeTree或BananaTree中。
现在我的问题是,我可以以某种方式将正确的类型传递回调用类,无论哪种类型(Apple,Banana,Orange)调用它,而不在调用类中进行转换?如果是这样,怎么样?如果没有,参考,所以我知道绝对没有办法做到这一点。
public class TreeMangement
{
public string id {get; set;}
public TreeMangement()
{
id = this.GetType().Name+"|"+Guid.NewGuid();
}
public static TreeMangement Find(string idIn)
{
string type = idIn.Split('|')[0];
return Functions.GetObj(idIn, GetFilePath(type), type); //returns back the right type
}
}
public class AppleTree:TreeMangement
{
public string Name;
}
public class OrangeTree:TreeMangement
{
public string Name;
}
public class BananaTree:TreeMangement
{
public string Name;
}
///////Calling class////
AppleTree savedAppleTree = AppleTree.Find("SomeValidID");
OrangeTree savedOrangeTree = OrangeTree.Find("SomeValidID");
BananaTree savedBananaTree = BananaTree.Find("SomeValidID");
答案 0 :(得分:1)
您可以将超类更改为通用超类,如下所示:
public class TreeMangement<T>
where T: class
{
...
public static T Find(string idIn)
{
return ... as T;
}
}
现在,您可以在子类中指定返回类型,例如
public class AppleTree:TreeMangement<AppleTree>
{
public string Name;
}
public class OrangeTree:TreeMangement<OrangeTree>
{
public string Name;
}
public class BananaTree:TreeMangement<BananaTree>
{
public string Name;
}
这样你的3个查找调用就可以正常编译,因为Find()
调用将返回正确的类型:
var savedAppleTree = AppleTree.Find("SomeValidID");
var savedOrangeTree = OrangeTree.Find("SomeValidID");
var savedBananaTree = BananaTree.Find("SomeValidID");