忽略C#中的接口方法实现

Maz*_*han 2 c# oop

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

一个类A实现一个接口I.

类A只能实现Method1()并忽略Method2()吗?

我知道按规则类A必须编写两种方法的实现.我在问是否有办法违反这条规则?

Tim*_*ora 9

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

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();
}
Run Code Online (Sandbox Code Playgroud)


Fis*_*rdo 5

不,可选接口成员的C#中没有这样的概念。如果是AImplements I,则I即使实现不执行任何操作或仅引发异常,它也必须为所有的成员提供某种实现。

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

    public void Method2()
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

从设计的角度来看,您为什么仍要使用静态类型的语言来执行此操作?此外,为什么不只有两个接口呢?

public interface I1 { void Method1(); }

public interface I2 { void Method2(); }
Run Code Online (Sandbox Code Playgroud)

使用这样的接口编码,您可以拥有实现一个接口或另一个接口,或两者都实现,或两者都不实现的类。对我而言,这更有意义。


更新2018-06-13

C#lang Git Hub 正在进行有关默认接口方法的建议。简而言之,接口开发人员将能够为接口本身中的一个或多个方法提供实现,并且使用其类或结构上的接口的开发人员将不必显式实现那些方法。OP并不一定要问这个问题,但可能很有用。


Cod*_*aos 5

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

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

class A : I
{
  void I.Method2()
  {
    throw new NotSupportedException();
  }
}
Run Code Online (Sandbox Code Playgroud)

然后

A a;
a.Method2(); //doesn't compile
I i = a;
i.Method2(); //works
Run Code Online (Sandbox Code Playgroud)

如果类A只是一个抽象基类,您还可以使用一种abstract方法来实现接口,将具体实现留给派生类.