C#一个超类如何在不从调用类强制转换的情况下返回3种可能的类型

C#一个超类如何在不从调用类强制转换的情况下返回3种可能的类型,c#,inheritance,subclass,superclass,C#,Inheritance,Subclass,Superclass,在我开始之前,我想声明我意识到这不是一个理想的方法。但是,不能根据赋值规则更改调用类。我曾试图理解并找到解决这个问题的办法,但我没有运气 下面有一个超类TreeMagement(这些子类只能有一个超类)。有3个子类(苹果、橘子和香蕉)。“find”方法必须在treemagement超类中。我不允许重写“find”方法。使用当前代码,我将在调用类中得到一个强制转换错误。它将声明树管理不能将隐式转换为AppleTree、OrangeTree或BananaTree 现在我的问题是,不管调用的是什么类型

在我开始之前,我想声明我意识到这不是一个理想的方法。但是,不能根据赋值规则更改调用类。我曾试图理解并找到解决这个问题的办法,但我没有运气

下面有一个超类TreeMagement(这些子类只能有一个超类)。有3个子类(苹果、橘子和香蕉)。“find”方法必须在treemagement超类中。我不允许重写“find”方法。使用当前代码,我将在调用类中得到一个强制转换错误。它将声明树管理不能将隐式转换为AppleTree、OrangeTree或BananaTree

现在我的问题是,不管调用的是什么类型(苹果、香蕉、橙色),我是否能够以某种方式将正确的类型传递回调用类,而不必在调用类中进行强制转换?如果是,怎么做?如果没有,那么我知道绝对没有办法

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;
    }
}

要么将
Find()
作为通用方法,而返回类型是gerneric参数,或者在子类中隐藏
Find()
以实现转换。对于通用方法,我是否必须从调用类传递类型?或者它会根据调用它的子类来推断它吗?我不允许在子类中隐藏find()。请看我的答案哦,我喜欢你要去的地方。但是,我在调用classI时遇到以下错误“缺少编译器所需的成员Microsoft.CSharp.RunTimeBinder.Binder.Convert”。我实际创建了一个新项目,并运行了此代码,它正常工作。这意味着错误来自我的查找函数!不是你的代码。谢谢你教我这个方法!
public class AppleTree:TreeMangement<AppleTree>
{
     public string Name;
}  

public class OrangeTree:TreeMangement<OrangeTree>
{
     public string Name;
}

 public class BananaTree:TreeMangement<BananaTree>
{
     public string Name;
}
var savedAppleTree = AppleTree.Find("SomeValidID");
var savedOrangeTree = OrangeTree.Find("SomeValidID");
var savedBananaTree = BananaTree.Find("SomeValidID");