在Parent类中返回子类型

时间:2015-02-18 13:37:40

标签: c#

      public abstract class Base
      {
         public Base ClassReturn()
        {
            return this;
        }
      }

是否有可能返回调用ClassReturn方法的子类型? 我在扩展方法中做到了这一点:

public static T ClassReturn<T>(this T obj) where T : Base
        {
            return (T) obj.ClassReturn();
        }

但我想将它嵌入Base类而不是扩展方法。是否有可能用泛型做到这一点?

我将复制我的评论,其中描述了我想要实现的目标:

  

我需要与构建器模式类似的东西,我有不同的东西   依赖于以前的操作的类做了别的事,现在我   我想在每个人和我使用时都有类似的功能   我失去了对象类型。所以我的解决方案就是实现它   功能在每个类中多次或创建扩展   方法。但我一直在想什么时候可以进行扩展   类的方法然后我可以在课堂上嵌入,但正如我所看到的那样   不可能。

完整示例:

 public class Child1 : Base
        {
            public Child1 Operation1()
            {
                Console.WriteLine("operation1");
                return this;
            }
        }

        public class Child2 : Base
        {
            public Child2 Operation2()
            {
                Console.WriteLine("operation2");
                return this;
            }
        }



        static void Main(string[] args)
        {
            Child1 ch = new Child1();
            ch.Operation1().Operation1().ClassReturn().Operation1()
        }

如果我不使用扩展方法,我不能在ClassReturn之后使用Operation1。

2 个答案:

答案 0 :(得分:2)

试试这个:

public abstract class Base<T> where T: Base<T>
{
    public T ClassReturn
    {
        get { return (T)this; }
    }
}

public class Child1 : Base<Child1>
{
}

public class Child2 : Base<Child2>
{
}

答案 1 :(得分:0)

从您的问题和您的评论中,您尝试实现的目标无法直接来自类型系统。通过返回Base的实例,您特别要说的是您感兴趣的是您拥有源自Base的内容,但特定类并不重要。静态地,编译器不再具有执行强制转换所需的信息。

如果您尝试静态恢复原始类型,则必须向编译器提供信息,在这种情况下,您无法保证您拥有正确的信息。在下面的示例中,实例是从派生类型A创建的,但是尝试通过扩展转换为派生类型B,编译器将允许代码编译,但是您将获得

。运行时异常
public class A : Base { }
public class B : Base { }

public static class BaseExtensions
{
    public static T GetAsT<T>(this Base base)  where T: Base
    {
       return (T)base;
    }
}


public static void Main() 
{
    Base obj = new A();
    B b = obj.BaseAsT<B>(); // This compiles but causes an exception
}

您应该查找Liscov Substitution Principle以获取有关如何在系统中正确使用基类和派生类的信息,然后编写一个专门处理您尝试实现的结果的问题。