4

假设一个接口I有两个方法。例如Method1()Method2()

一个类A实现一个接口I

类是否可以A仅实现Method1()并忽略Method2()

我知道根据规则类A必须编写这两种方法的实现。我想问有没有办法违反这个规则?

4

5 回答 5

10

您可以避免实现它(一个有效的场景),但不能完全忽略它(一个有问题的场景)。

public interface IFoo
{
    void A();
    void B();
}

// This abstract class doesn't know what to do with B(), so it puts
// the onus on subclasses to perform the implementation.
public abstract class Bar : IFoo
{
    public void A() { }
    public abstract void B();
}
于 2012-12-03T17:11:26.763 回答
6

不,可选接口成员的 C# 中没有这样的概念。如果Aimplements I,那么它必须为所有I的成员提供一些实现,即使实现什么也不做或只抛出一个异常。

public class A : I
{
    public void Method1()
    {
        // Do nothing.
    }

    public void Method2()
    {
        throw new NotImplementedException();
    }
}

从设计的角度来看,为什么要在静态类型语言中这样做呢?此外,为什么不只有两个接口?

public interface I1 { void Method1(); }

public interface I2 { void Method2(); }

使用这样编码的接口,您可以拥有实现一个接口或另一个接口,或两者兼有,或两者都不实现的类。对我来说,无论如何这更有意义。


更新 2018-06-13

C# lang Git Hub正在对默认接口方法提出建议。简而言之,接口开发人员将能够在接口本身中为一个或多个方法提供实现,并且在其类或结构上使用接口的开发人员不必显式地实现这些方法。不完全是 OP 所要求的,但可能有用。

于 2012-12-03T17:10:47.660 回答
5

您必须实现类继承的接口的所有方法。没有办法解决这个问题。但是您可以使用显式接口实现来隐藏该方法。

这样,用户就不会看到以类为类型的变量上的方法,但是当他转换为接口时,他可以调用该方法。

class A : I
{
  void I.Method2()
  {
    throw new NotSupportedException();
  }
}

然后

A a;
a.Method2(); //doesn't compile
I i = a;
i.Method2(); //works

如果类A只是抽象基类,也可以用abstract方法实现接口,具体实现留给派生类。

于 2012-12-03T17:11:38.773 回答
3

不,没有。

但是你可以编码:

public void Method2(){
    throw new NotImplementedException();
}

这将通知应用程序无法从此实例调用此方法。

于 2012-12-03T17:11:19.547 回答
1

是的,如果我是一个类,但不是,如果它是一个接口。

于 2012-12-03T17:11:42.190 回答