假设一个接口I有两种方法.例如Method1()和Method2().
一个类A实现一个接口I.
类A只能实现Method1()并忽略Method2()吗?
我知道按规则类A必须编写两种方法的实现.我在问是否有办法违反这条规则?
您可以避免实现它(一个有效的场景)但不要完全忽略它(一个有问题的场景).
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)
不,可选接口成员的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并不一定要问这个问题,但可能很有用。
您必须实现您的类继承的接口的所有方法.没有办法解决这个问题.但是您可以使用显式接口实现来隐藏方法.
这样,用户就不会在类具有类型的变量上看到该方法,但是当他转换为接口时,他可以调用该方法.
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方法来实现接口,将具体实现留给派生类.