假设一个接口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();
}
不,可选接口成员的 C# 中没有这样的概念。如果A
implements 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 所要求的,但可能有用。
您必须实现类继承的接口的所有方法。没有办法解决这个问题。但是您可以使用显式接口实现来隐藏该方法。
这样,用户就不会看到以类为类型的变量上的方法,但是当他转换为接口时,他可以调用该方法。
class A : I
{
void I.Method2()
{
throw new NotSupportedException();
}
}
然后
A a;
a.Method2(); //doesn't compile
I i = a;
i.Method2(); //works
如果类A
只是抽象基类,也可以用abstract
方法实现接口,具体实现留给派生类。
不,没有。
但是你可以编码:
public void Method2(){
throw new NotImplementedException();
}
这将通知应用程序无法从此实例调用此方法。
是的,如果我是一个类,但不是,如果它是一个接口。