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");