我有一个抽象类A和一个带有参数的抽象方法,该参数又是在同一个抽象类A中定义的抽象类B.当我将这个抽象类A扩展为另一个类C的一部分时,我如何实现该方法嵌套抽象类的参数。
public abstract class A<T, V>
{
public abstract int GetObject(T t, V v);
public abstract int GetAnotherObject(B b);
public abstract class B{}
}
此类由另一个C类扩展
public class C: A<ABC, DEF>
{
public C()
{
}
public override int GetObject(ABC abc, DEF def)
{
return 10;
}
public override int GetAnotherObject(B b)
{
return 15;
}
}
如何使用一些属性实现B类并传入GetAnotherObject方法。有人可以帮助我。
答案 0 :(得分:4)
来自ECMA:
任何嵌套在泛型内的类 类声明或通用结构 声明(第25.2节)本身就是一个 泛型类声明,因为类型 包含类型的参数 应提供以创建一个 构造类型。
因此,如果不为B
提供类型参数,则无法实现嵌套A
。
void Main()
{
var c = new C();
var result = c.GetAnotherObject(new BImpl<string, int>());
}
public class BImpl<T, V> : A<T, V>.B
{
public override int BM()
{
return 1;
}
}
// Or you can supply type arguments right here
//public class BImpl : A<string, int>.B
//{
// public override int BM()
// {
// return 1;
// }
//}
public abstract class A<T, V>
{
public abstract int GetObject(T t, V v);
public abstract int GetAnotherObject(B b);
public abstract class B
{
public abstract int BM();
}
}
public class C : A<string, int>
{
public C()
{
}
public override int GetObject(string abc, int def)
{
return 10;
}
public override int GetAnotherObject(B b)
{
return b.BM();
}
}
答案 1 :(得分:2)
你已经非常接近了。
public class C<ABC, DEF> : A<ABC, DEF>
{
public C()
{
}
public override int GetObject(ABC abc, DEF def)
{
return 10;
}
// since B is a nested class of A, it has no scope outside of A
// outside of the definition of A, it must always be referred to as A.B
public override int GetAnotherObject(A<ABC,DEF>.B b)
{
return 15;
}
}
public class D : A<ABC,DEF>.B
{
// implementation of A.B
}
请注意,C
总是正好A.B
。您永远无法定义A.B
的实现(让我们称之为D
)并且C
的方法签名是指覆盖中的方法签名。在{A}中定义GetAnotherObject
为A.B
,因此必须实施{em>任何 A.B
,而不是A.B
的某些具体实现。< / p>
RE:您对如何在A.B
C
的评论
在A.B
内实施C
没有意义。 C
仍需要在其方法签名中包含A.B
。但如果你真的必须,出于某种原因。
public class C<ABC, DEF> : A<ABC, DEF>
{
// C's implementation of A
public override int GetAnotherObject(A<ABC,DEF>.B b)
{
return 15;
}
public class D : A<ABC,DEF>.B
{
// implementation of A.B
}
}
请注意,GetAnotherObject
仍然需要A.B
,而不是D
。
答案 2 :(得分:0)
怎么样
public class C<ABC, DEF> : A<ABC, DEF>
{
public C()
{
}
public override int GetObject(ABC abc, DEF def)
{
return 10;
}
public override int GetAnotherObject(B b)
{
return 15;
}
}
只需使用泛型对类进行后缀。