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。
答案 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以获取有关如何在系统中正确使用基类和派生类的信息,然后编写一个专门处理您尝试实现的结果的问题。