2012-09-04 4 views
11
中に新しいパラメータ名を選択させて頂いております

これは愚かな質問ですが、私はちょうどこの気づいたかどうかわからない「MaxRecordsプロパティ」私は私の二番目のパラメータと呼ばれている私の実装の内部インターフェイス定義でパラメータ名が必要なのはなぜですか?私は、実装

public interface IActivityDao : IDao<Activity> 
{ 
    IList<Activity> GetAllSinceSequence(long sequence, int count); 
} 

public class ActivityDao : AbstractNHibernateDao<Core.Domain.Activity>, IActivityDao 
{   
    public IList<Activity> GetAllSinceSequence(long sequence, int maxRecords) 
    { 

    } 
} 

をそれでも、インターフェイスでは、「カウント」として定義されています。コンパイラはまだ実装されているインタフェースを考慮していますが、それは良いですが、あいまいさを招く可能性があります。明らかに、私は他のパラメータと一致するようにパラメータの名前を変更する必要があります。

名前を変更する前にちょっと遊んで面白いことに気づいた。

これはコンパイラがC#のsymanticsに対して過度に保護されているということですか?インタフェースのメソッドのパラメータ名は、コードを読みやすくする以外の目的には何の目的がありますか?実装時にパラメータ名が強制されないと、あいまいさを招くようです。

答えて

19

実装を明確にし、参照するために、インタフェース宣言にパラメータ名が必要です。誰かがあなたのインターフェースを使用していた場合、メソッドパラメータの名前は自己文書化されているので、インターフェースの消費者は何をメソッドに渡すべきかを理解します(例えば、IntelliSenseでメソッドの説明を表示するときなど)

はい、あなたはあなたが望むものであれ、パラメータに名前をつけることができるインターフェースを実装します。

+0

あなたはより多くのupvotesが必要です。あなたはずっと最高の答えを持っています。 OPの質問には非常に簡潔に答えました。 – Enigmativity

+2

まあ、並べ替え。答えは、明らかに、私の記事の最後の文には実際には言及していません。実装時にパラメータの名前が同じになるという保証がないのはなぜですか?唯一の意図が自己文書化であり、明確であるならば、その明快さを実装に至るまで徹底してみてはどうでしょうか?私は実際に 'maxResults'を期待しているときに私のメソッドを誤って 'count'を受け入れるものとして宣伝したくありません。 –

+3

実装レベルでは、より具体的な自己文書化が必要な場合があります。 Execute(int operand1、int operand2)メソッドを使用してIBinaryMathOperationインターフェイスを作成したとします。次に、インターフェイスを実装するAddOperationクラスを実装しました。 addメソッドの "オペランド"は、特に "加点"と呼ばれ、Execute()の特定の実装で呼び出すことができます。 – KeithS

2

私はこれがという名前のパラメータのC#の機能によるものだと思います。オブジェクトをインスタンスとしてキャストされた場合はもちろん

IActivityDao dao; 
dao.GetAllSinceSequence(count: 1, sequence: 2); 

、パラメータ名が異なる次のようになります。つまり、あなたはデフォルトの順序だけではなく、名前でパラメータを指定できるようにする必要があります。

var concreteDao = (ActivityDao) dao; 
concreteDao.GetAllSinceSequence(maxRecords: 1, sequence: 2); 
+2

上記の機能のポストデートは、ほとんどの10年の間にインタフェースしています。 –

+0

@KirkWoll ha ...良い点があります。 – McGarnagle

2

私にお聞かせください。.netフレームワークのどこにでも、パラメータ名なしのメソッドシグネチャを定義することができますか?

すべてのことが可能ですが、ほとんどの事柄が理由のためにあります。この場合、これはフレームワークとコンパイラ設計の限界であり、本当に重要ですか?

結局のところ、使用契約を結んでいると、本当にそこにいると思います。

+0

+1契約に言及する場合 –

1

C#およびVBのような多くの言語はnamed and option arguments to methodsをサポートしています。インタフェースの引数名がなければ、名前付き引数とオプション引数を使用することはできません。引数の命名は、読者がインタフェースの意図と機能を理解するのにも役立ちます。

8

COMが世界を支配した時代に、これは.NETの非常に初期の時代にまで戻ります。 COMとの相互作用が可能であることは、非常にであり、まったく新しいプログラミングスタイルを採用するためにすべてを捨て去る者はいなかった。

これは、一般に.NETでCOM相互運用性を強くサポートしています。インターフェイスメソッドに名前付き引数を付ける必要性と同様に、型ライブラリはそれらを必要とします。

興味深いケースは、永遠にC++/CLI言語です。宣言でパラメータ名を省略することを含む、多くのC++構文規則を採用しました。言い換えれば、これは合法である:あなたがC#クラスでインターフェイスを実装する場合のIntelliSenseにより自動生成として、

HRESULT bar(
        [in] long p1, 
        [in] long p2, 
        [in] double p3); 

非常に類似した結果:

public interface class IFoo 
    { 
     void bar(int, long, double); 
    }; 

タイプライブラリの輸出国は、この宣言を生成し

class FooImpl : cpptemp36.IFoo { 
    public void foo(int __p1, int __p2, double __p3) { 
     throw new NotImplementedException(); 
    } 
} 

これは誰も幸せにしません。

関連する問題