Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#,使用self作为基类的抽象重写方法的参数_C#_Inheritance_Abstract - Fatal编程技术网

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

C#,使用self作为基类的抽象重写方法的参数,c#,inheritance,abstract,C#,Inheritance,Abstract,如何在子类中重写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 fo

如何在子类中重写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)
    }
}
公共抽象类Z{}
公共类DerivedZ:Z
{
public DerivedZ(B someB,int num)
{
//在这里初始化
}
}
//不会编译
//错误:“B.GetZ(B,int)”:未找到可重写的合适方法
//错误:“B”未实现继承的抽象成员“A.GetZ(A,int)”
公共抽象类A,其中T:Z
{
公共摘要T GetZ(一个输入,int可选=1);
}
B级:A级
{       
公共覆盖DerivedZ GetZ(B someB,int可选=1)
{
返回新的DerivedZ(someB,可选)
}
}
但这是可行的

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);
    }
}
公共抽象类A其中T:Z其中U:A
{
公共摘要T GetZ(U输入,int可选=1);
}
B级:A级
{
公共覆盖DerivedZ GetZ(B someB,int可选=1)
{
返回新的DerivedZ(someB,可选);
}
}

不能使用第一个表单,因为它没有正确地重写该方法。如果您能够做到这一点,请想象以下代码:

public class C : A<DerivedZ> {}

A<DerivedZ> x = new B();
x.GetZ(new C());
公共类C:A{}
A x=新的B();
x、 GetZ(新C());
这应该很好,毕竟-
A.GetZ
只是声明接受
A
,而
C
A

你展示的方法很好


我同意,有时可以说“某种类型的东西”是有用的,但它不是C类型系统的一部分。

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

public class C : A<DerivedZ> {}

A<DerivedZ> x = new B();
x.GetZ(new C());
公共类C:A{}
A x=新的B();
x、 GetZ(新C());
这应该很好,毕竟-
A.GetZ
只是声明接受
A
,而
C
A

你展示的方法很好


我同意有时候说“某种类型的东西”会很有用,但这不是C型系统的一部分。

你已经确切地说明了需要如何做到这一点。错误消息(您没有费心列出)清楚地说明了您的第一个解决方案不起作用的原因。简单的回答是:您不能。DerivedZ是否需要接受a
B
,而不是a
a
B
中的
GetZ
是否需要接受a
B
而不是
a
?仅供参考,您的第二个有效表单的术语称为“。谢谢,我用错误代码更新了它。Servy,A也没有编译。您已经确切地说明了需要如何编译。错误消息(您没有费心列出)清楚地说明了您的第一个解决方案不起作用的原因。简单的回答是:您不能。DerivedZ是否需要接受a
B
,而不是a
a
B
中的
GetZ
是否需要接受a
B
而不是
a
?仅供参考,您的第二个有效表单的术语称为“。谢谢,我用错误代码更新了它。Servy,A也没有编译。再次感谢您的确认Jon,当我得到您的关注时,我想我可能会问您是否可以写一篇关于为组合而不是继承而设计的短文,如果您这样做,我将非常感激;)我在6年前写了这篇文章:虽然我现在可以更好地表达自己了:)我相信大部分内容仍然是相关的,干杯!再次感谢您的确认,Jon,当我得到您的关注时,我想我可能会问您是否可以写一篇关于为创作而不是继承而设计的短篇博文,如果您这样做,我将不胜感激;)我在6年前写了这篇文章:虽然我现在可以更好地表达自己了:)我相信大部分内容仍然是相关的,干杯!