在C#层次结构中使用不同的返回类型覆盖(阴影,重载?)方法

时间:2013-12-21 01:00:38

标签: c# oop override overloading shadowing

我正在编写一个具有OOP结构的SDK,用于实现数据类型;

  1. 首先是一个界面
  2. 然后是抽象实现
  3. 最后是一个抽象的通用实现
  4. 人们可以选择实现接口,也可以从任何一个类派生。

    public interface IGoo
    {
      IGoo Duplicate();
      ...
    }
    public abstract class Goo : IGoo
    {
      IGoo IGoo.Duplicate() {
        return Duplicate();
      }
      abstract public Goo Duplicate();
      ...
    }
    public abstract class Goo<T> : Goo
    {
      abstract public Goo<T> Duplicate(); ??????
      ...
    } 
    

    我想重新实现Duplicate方法,以便它始终返回最具体的类型。即当你在IGoo实例上调用Duplicate时,你会得到另一个IGoo。如果你在Goo上调用它,你会得到Goo,如果你在-say- Goo&lt; int&gt;上调用它,你会得到Goo&lt; int&gt;。并且所有Duplicate()方法总是调用最具体的实现。

    这可能吗?是否只有在可以明确实现接口的情况下才有可能?在这种情况下,我不应该使Goo&lt; int&gt;从Goo派生,但让它实现IGoo而不是两次输入所有低级功能?

2 个答案:

答案 0 :(得分:1)

以下情况如何?

public interface IObj
{
    IObj Duplicate();
}

public abstract class Obj : IObj
{
    public Obj()
    {

    }
    public virtual IObj Duplicate()
    {
        return this;
    }
}

public abstract class ObjT<T> : Obj
{
    public ObjT()
    {

    }
    public override IObj Duplicate()
    {
        return this;
    }
}

public class ObjImpl : Obj
{

}

public class ObjTImpl : ObjT<int>
{

}

我知道你希望它在任何继承类中返回最具体的类型但实际上是。它将继承类型装入接口(或者是原始对象,如果你在哪里返回对象而不是接口类型。如果你在控制台应用程序中运行以下测试,你会看到正确的类型被表示:

namespace TestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            ObjImpl a = new ObjImpl();

            ObjTImpl b = new ObjTImpl();

            Console.WriteLine(a.Duplicate().GetType());
            Console.WriteLine(b.Duplicate().GetType());

            Console.ReadLine();
        }
    }
}

// outputs:

// ObjImpl
// ObjTImpl

重新定义摘要摘要的想法违背了抽象多态的目的。如果派生类型不打算实现继承的抽象成员,则不应继承它。

虽然我上面给出的示例需要强制转换才能访问任何特定于子类的成员,但在这种方法中这是正确的方法。运行时需要知道它应该处理的类型。

总有动力可以玩,但老实说我没有玩过泛型和继承的动态因为我怀疑我会让我的编译器哭,当它哭的时候,我哭了,有点深在里面......哈哈

答案 1 :(得分:1)

只有在明确实现接口时才有可能。那是因为方法的返回类型不是其签名的一部分 - 编译器在重载时检查。因此,只有在返回类型上不同的相同方法在语法上是不可能的。