我有三个类,每个类都会返回略有不同的结果。
// interfact to a king
public interface IKing{
public Result Get();
}
// main abstract class
public abstract class King:IKing{
public abstract Result Get();
}
// main abstract result
public abstract class Result{
public int Type {get;set;}
}
// KingA result
public class ResultA:Result{
...
}
// KingB result
public class ResultB:Result{
...
}
// concrete implementations
public class KingA:King{
public override ResultA Get(){
return new ResultA;
}
}
public class KingB:King{
public override ResultB Get(){
return new ResultB
}
}
由于King
的{{1}}覆盖方法期待Get
课程并且不接受其子Result
和ResultA
,因此无效。
/ p>
我能采取更好的方法吗?
答案 0 :(得分:4)
通常的做法是使用泛型。
public interface IKing<T> where T:Result{
T Get();
}
public class King<T> : IKing<T>
public abstract T Get();
}
public class KingA : King<ResultB> {
public override ResultA Get(){
return new ResultA();
}
}
public class KingB : King<ResultB> {
public override ResultB Get(){
return new ResultB();
}
}
编辑:修复语法。
答案 1 :(得分:1)
如果您使用编译的代码,它会有所帮助。你的“具体实现”是假的,看起来你混合了类和方法的概念。这里没有设计问题。例如:
public class KingA : King {
public override Result Get() {
return new ResultA();
}
}
答案 2 :(得分:1)
我认为这里存在一些语法混淆 - 如果我正确地捕捉到你的意图,这样可以正常工作:
// interface to a king
public interface IKing
{
Result Get();
}
// main abstract class
public abstract class King : IKing
{
public abstract Result Get();
}
// main abstract result
public abstract class Result
{
private int _Type;
public int Type { get { return _Type; } set { _Type = value; } }
}
// KingA result
public class ResultA : Result
{
}
// KingB result
public class ResultB : Result
{
}
// concrete implementations
public class KingA : King
{
public override Result Get()
{
return new ResultA();
}
}
public class KingB : King
{
public override Result Get()
{
return new ResultB();
}
}
class Program
{
static void Main(string[] args)
{
IKing ka = new KingA();
IKing kb = new KingB();
Result ra = ka.Get();
Result rb = kb.Get();
if (ra is ResultA)
{
Console.WriteLine("A ok!");
}
if (rb is ResultB)
{
Console.WriteLine("B ok!");
}
}
}
(为格式编辑)
答案 3 :(得分:0)
您应该能够在ResultA
的实现中明确地将ResultB
和Result
转换为Get
(我假设这是“具体实现”的意图是)。