C# superclass return 如何在不从调用 class 强制转换的情况下返回 3 种可能的类型
C# How could a superclass return back 3 possible types without casting from the calling class
在开始之前,我想声明我意识到这不是理想的方式。但是调用class不能根据赋值规则改变。我试图理解并找到解决这个问题的方法,但我没有运气。
下面有1个superclass,TreeMangement(这些subclass只能有1个superclass)。有 3 个子classes(苹果、橙子和香蕉)。 "find" 方法必须在 TreeMangement superclass 中。我不允许覆盖 "find" 方法。使用当前代码,我将在调用 class 时遇到转换错误。它将说明 TreeMangement 不能隐式转换为 AppleTree、OrangeTree 或 BananaTree。
现在我的问题是,我是否能够以某种方式将正确的类型传递回调用 class,而不管调用它的是什么类型 (Apple,Banana,Orange),而无需在调用 class?如果是这样,如何?如果没有,请参考,所以我知道绝对没有办法做到这一点。
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");
您可以像这样将超类更改为通用超类:
public class TreeMangement<T>
where T: class
{
...
public static T Find(string idIn)
{
return ... as T;
}
}
现在您可以在子类中指定 return 类型,例如
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 调用将编译得很好,因为 Find()
调用将 return 正确的类型:
var savedAppleTree = AppleTree.Find("SomeValidID");
var savedOrangeTree = OrangeTree.Find("SomeValidID");
var savedBananaTree = BananaTree.Find("SomeValidID");
在开始之前,我想声明我意识到这不是理想的方式。但是调用class不能根据赋值规则改变。我试图理解并找到解决这个问题的方法,但我没有运气。
下面有1个superclass,TreeMangement(这些subclass只能有1个superclass)。有 3 个子classes(苹果、橙子和香蕉)。 "find" 方法必须在 TreeMangement superclass 中。我不允许覆盖 "find" 方法。使用当前代码,我将在调用 class 时遇到转换错误。它将说明 TreeMangement 不能隐式转换为 AppleTree、OrangeTree 或 BananaTree。
现在我的问题是,我是否能够以某种方式将正确的类型传递回调用 class,而不管调用它的是什么类型 (Apple,Banana,Orange),而无需在调用 class?如果是这样,如何?如果没有,请参考,所以我知道绝对没有办法做到这一点。
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");
您可以像这样将超类更改为通用超类:
public class TreeMangement<T>
where T: class
{
...
public static T Find(string idIn)
{
return ... as T;
}
}
现在您可以在子类中指定 return 类型,例如
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 调用将编译得很好,因为 Find()
调用将 return 正确的类型:
var savedAppleTree = AppleTree.Find("SomeValidID");
var savedOrangeTree = OrangeTree.Find("SomeValidID");
var savedBananaTree = BananaTree.Find("SomeValidID");