C#:当覆盖像Java do这样的方法时,是否替换参数的子类/子类型?

C#:当覆盖像Java do这样的方法时,是否替换参数的子类/子类型?,java,c#,oop,interface,Java,C#,Oop,Interface,在java中,我可以这样做: public class A { //... } public class B extends A { //... } public interface I { void test(A a); } public class C implements I { //i can use class B as parameters in java but how to do in .net ? // not work in .n

在java中,我可以这样做:

public class A {
    //...
}

public class B extends A {
    //...
}

public interface I {
    void test(A a);
}

public class C implements I {
    //i can use class B as parameters in java but how to do in .net ?
    // not work in .net
    @override
    public void test(B b){

    }
}

我可以在java中使用类B作为参数,但在.net中如何做?

为了实现接口成员
I.test(A)
C
test()
方法必须是公共的、非静态的,并且与接口成员具有相同的名称和签名

C.test
不符合一个标准:它没有与
I.test
相同的签名


选项1:实现接口 当然,您仍然可以将
B
实例传递到
C.test

var b = new B();
var c = new C();
c.test(b);//works just fine
选项2:更改接口 假设您在
C
中实现
I
取决于
B
上的属性,而不是
a
。进一步假设,
I.test
是一种非常有效的写入方法,只要传入的参数扩展了
a

在这种情况下,您可以尝试以下操作:

public class A
{
    //...
}

public class B : A
{
    //...
}

public interface I<T> where T : A
{
    void test(T a);
}

public class C : I<B>
{
    public void test(B b)
    {

    }
}
公共A类
{
//...
}
B级:A级
{
//...
}
公共接口I,其中T:A
{
孔隙试验(TA);
}
公共C类:I类
{
公开无效测试(B)
{
}
}

它利用了,而且看起来可能更接近你想要表达/完成的东西

这在java中甚至不起作用,为了实现
I
,测试参数类型必须是
A
。如果java允许这样做,我会非常惊讶,因为这会破坏接口的契约。
public void test(A){/*do something*/}
是类C可用的唯一选项。没有public关键字,编译时会有错误。@Saurav Sahu对此很抱歉,我忘记了
public
很高兴能帮上忙!请查看一些关键指导原则的详细信息。:-)
public class A
{
    //...
}

public class B : A
{
    //...
}

public interface I<T> where T : A
{
    void test(T a);
}

public class C : I<B>
{
    public void test(B b)
    {

    }
}