C#如果没有从调用类中强制转换,超类如何返回3种可能的类型

时间:2017-07-28 05:41:36

标签: c# inheritance subclass superclass

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

下面有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");

1 个答案:

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