繁体   English   中英

C#,将self用作基类的抽象重写方法的参数

[英]C#, Using self as a parameter for an abstract override method of the base class

如何在子类中重写DerivedZ(),而不必在基类中指定U? 后一种解决方案似乎有点过分。

public abstract class Z {}
public class DerivedZ : Z 
{
    public DerivedZ (B someB, int num)
    {
        // initialize here
    }
}

// will not compile
// error: 'B.GetZ(B, int)': no suitable method found to override
// error: 'B' does not implement inherited abstract member 'A<DerivedZ>.GetZ(A<DerivedZ>, int)'
public abstract class A<T> where T : Z
{
    public abstract T GetZ (A<T> inputA, int optional=1);
}

public class B : A<DerivedZ>
{       
    public override DerivedZ GetZ (B someB, int optional=1)
    {
        return new DerivedZ (someB, optional)
    }
}

这虽然有效...

public abstract class A<T,U> where T : Z where U : A<T,U>
{
    public abstract T GetZ (U inputA, int optional=1);
}

public class B : A<DerivedZ,B>
{
    public override DerivedZ GetZ (B someB, int optional=1)
    {
        return new DerivedZ (someB, optional);
    }
}

您不能使用第一种形式,因为它没有正确覆盖方法。 如果可以做到这一点,请想象以下代码:

public class C : A<DerivedZ> {}

A<DerivedZ> x = new B();
x.GetZ(new C());

毕竟,这应该可以正常工作-刚声明A<T>.GetZ接受A<T> ,而C A<DerivedZ>

您展示的方法很好。

我同意有时能够说“相同类型的东西”会很有用,但它不是C#类型系统的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM