開始する前に、これはこれを行う理想的な方法ではないことを認識しておきたいと思います。ただし、呼び出しのクラスは割り当ての規則に従って変更することはできません。私はこの問題を理解し解決することを試みたが、運がなかった。C#スーパークラスが呼び出し元クラスからキャストせずに3つの可能な型を返す方法
下に1つのスーパークラス、TreeMangement(これらのサブクラスには1つのスーパークラスしか存在できません)があります。 3つのサブクラス(リンゴ、オレンジ、バナナ)があります。 "find"メソッドはTreeMangementスーパークラスになければなりません。私は "find"メソッドをオーバーライドすることは許されていません。現在のコードでは、呼び出し側クラスでキャストエラーが発生します。 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()'を隠してそこにキャストを実装します。 – ViRuSTriNiTy
一般的なメソッドの場合、呼び出し元クラスから型を渡す必要がありますか?あるいは、サブクラスがそれを呼んでいることに基づいて推論しますか? サブクラスでfind()を非表示にすることはできません。 –
私の答えを見てください – ViRuSTriNiTy