【问题标题】:C#: substituting a subclass/subtype of a parameter when overiding a method like Java do?C#:在重写像 Java 这样的方法时替换参数的子类/子类型?
【发布时间】:2016-05-18 03:21:34
【问题描述】:

在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 中怎么做?

【问题讨论】:

  • 这甚至在java中都行不通,为了实现I,测试参数类型必须是A
  • 如果 Java 允许这样做,我会感到非常惊讶,因为这会破坏接口的约定。
  • public void test(A a){/*do something*/} 是 C 类唯一可用的选项。如果没有 public 关键字,则会出现编译时错误。
  • @Saurav Sahu 对此感到抱歉,我忘了public

标签: java c# oop interface


【解决方案1】:

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

C.test 不符合一项标准:它与I.test 的签名不同。


选项 1:实现接口

public class A {
    //...
}

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

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

public class C implements I {
    public void test(A a){

    }
}

当然,您仍然可以将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)
    {

    }
}

它使用了genericsgeneric type constraints,看起来它可能更接近你想要表达/完成的内容。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
相关资源
最近更新 更多