2017-07-28 94 views
0

在开始之前,我想说明我意识到这不是实现此目的的理想方式。但是,调用类不能根据赋值规则进行更改。我试图理解并找到解决这个问题的办法,但我没有运气。C#如何超类返回3种可能的类型,而不需要从调用类中投射

下面有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

要么使Find()成为一个泛型方法,而返回类型是gerneric参数,要么在你的子类中隐藏Find()来在那里实现一个转换。 – ViRuSTriNiTy

+0

对于泛型方法,我是否必须从调用类中传递类型?或者它会根据哪个子类调用它来推断它? 我不允许在子类中隐藏find()。 –

+0

请看看我的回答 – ViRuSTriNiTy

回答

1

可以超更改为通用超是这样的:

public class TreeMangement<T> 
    where T: class 
{ 
    ... 

    public static T Find(string idIn) 
    { 
     return ... as T; 
    } 
} 

现在你能specifiy返回类型在你的子类像

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

Ooooh我喜欢你要去的地方。不过,我收到以下错误“调用类 –

+1

上缺少编译器所需的成员'Microsoft.CSharp.RunTimeBinder.Binder.Convert”我实际上创建了一个新项目并运行此代码,它的工作原理。这意味着错误来自我的查找功能!不是你的代码。谢谢你教这个方法! –