2

私は次のインターフェースを持っています:

interface IExcelServices
{
    Dictionary<string, string[]> FilterFields(Dictionary<string, string[]>  excelContent);
    Dictionary<string, string[]> ParseExcelFile(string path);
}

次のクラスによって実装されます。

public class ExcelServices : IExcelServices
{
    public Dictionary<string, string[]> FilterFields(Dictionary<string, 
       string[]>  excelContent)
    {
        //somecode
    }

    public Dictionary<string, string[]> ParseExcelFile(string path)
    {
        //somecode
    }

    private void ReleaseObject(object obj)
    {
        //somecode
    }
}

私のコードは問題なくコンパイルされますが、インターフェイス定義に含まれていないプライベート メソッド(または一般的には任意のメソッド) を追加することが、 OO プログラミングの良い方法であるかどうか疑問に思っていました。

4

6 に答える 6

9

もちろん、インターフェイスを実装するクラスに他のメンバーを追加しても問題ありません。インターフェイスは、クラスが実装する必要があるものを指定する単なる契約ですが、必要なメンバーを追加することもできます (実際、ほとんどのクラスには、インターフェイスで宣言されたメンバーよりも多くのメンバーがあります)。

于 2011-05-27T09:34:50.377 に答える
4

インターフェイスの背後にある考え方は、それを実装するクラスにはインターフェイスの機能を含める必要があるというものです。これは、インターフェイスにあるものに制限する必要があるという意味ではありません。好きなだけ拡張できます。インターフェイスの一部ではないメソッドを持つことは完全に合理的です。同様に、複数のインターフェースを実装することもできます。

于 2011-05-27T09:36:13.250 に答える
2

はい、それで問題ありません。ただし、インターフェイスを実装するメソッドは、公開する、メソッドを明示的に実装する必要があります。

public Dictionary<string, string[]> FilterFields(...)

また

Dictionary<string, string[]> IExcelServices.FilterFields

メソッドのデフォルトの可視性は であるため、現在のコードはコンパイルに失敗しますprivate

于 2011-05-27T09:36:38.673 に答える
1

適切な OO プログラミングの実践は、インターフェースを超えた実装を妨げるものではありません。実際、インターフェースの目的は、残りのクラス実装を補完することです。

編集

さらに、非抽象クラスをインターフェースだけに限定して使用できるようにすることは不可能です。インターフェイスは、作成可能なクラスが持つ必要があるコンストラクターを定義しません。

于 2011-05-27T09:36:38.033 に答える
1

これは私にとってのデフォルトです。いくつかのインターフェースを実装すると、他の人があなたのクラスを簡単な方法で使用できるようになり、オブジェクト (クラス) を単一の部分 (インターフェース) として扱うことができます。
ただし、クラスを機能させるには、プライベート メソッドで実装する追加の操作が必要になる場合があります。
注意: インターフェイス メソッドを実装するメソッドはpublicでなければなりません!!

于 2011-05-27T09:36:41.337 に答える
0

はい、可能です。ただし、インターフェース内のすべてのメソッドを実装する必要があります。

于 2020-03-02T06:56:48.373 に答える