インターフェイスI
に 2 つのメソッドがあるとします。たとえば、Method1()
とMethod2()
.
クラスA
は Interface を実装し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
を実装する場合、実装が何もしないか、例外をスローするだけであっても、 のI
すべてI
のメンバーに何らかの実装を提供する必要があります。
public class A : I
{
public void Method1()
{
// Do nothing.
}
public void Method2()
{
throw new NotImplementedException();
}
}
設計の観点から言えば、静的に型付けされた言語でこれを行う必要があるのはなぜでしょうか? さらに、なぜ 2 つのインターフェースを持たないのでしょうか?
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();
}
これにより、このインスタンスからこのメソッドを呼び出すことができないことがアプリケーションに通知されます。
クラスならはい、インターフェースならいいえ。