【问题标题】:C# How could a superclass return back 3 possible types without casting from the calling classC# 超类如何在不从调用类强制转换的情况下返回 3 种可能的类型
【发布时间】:2018-01-04 01:27:39
【问题描述】:

在我开始之前,我想声明我意识到这不是这样做的理想方式。但是调用类不能根据分配规则改变。我试图理解并找到解决这个问题的方法,但我没有运气。

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

【问题讨论】:

  • 要么使Find() 成为泛型方法,而返回类型是通用参数,要么在您的子类中隐藏Find() 以在那里实现强制转换。
  • 对于泛型方法,我是否必须从调用类传递类型?或者它会根据哪个子类调用它来推断它?我不允许在子类中隐藏 find()。
  • 请看我的回答

标签: c# inheritance subclass superclass


【解决方案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 调用将编译得很好,因为 Find() 调用将返回正确的类型:

var savedAppleTree = AppleTree.Find("SomeValidID");
var savedOrangeTree = OrangeTree.Find("SomeValidID");
var savedBananaTree = BananaTree.Find("SomeValidID");

【讨论】:

  • 噢,我喜欢你要去的地方。但是我在调​​用类上收到以下错误“缺少编译器所需的成员'Microsoft.CSharp.RunTimeBinder.Binder.Convert”
  • 我实际上创建了一个新项目并运行了这段代码,它可以工作。这意味着错误来自我的查找功能!不是你的代码。谢谢你教我这个方法!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多