2011-12-23 111 views
19

在C#中,我們必須命名一個接口方法的參數。爲什麼我們必須命名接口方法參數?

我明白,即使我們沒有到,這樣做會幫助讀者理解其中的含義,但是在某些情況下,它是不是真的需要:

interface IRenderable 
{ 
    void Render(GameTime); 
} 

我會說上面的是可讀和有意義的下面:

interface IRenderable 
{ 
    void Render(GameTime gameTime); 
} 

有一些技術原因,都需要一個接口上的方法參數的名字呢?


值得一提的是,接口方法的實現可以使用不同的名稱那些在接口的方法。

+0

我認爲這將使方法簽名名一致! – 2011-12-23 09:22:13

+0

查看我編輯的最新評論。 – 2011-12-23 09:23:19

+1

我所指的就像方法聲明在類和接口之間一致... – 2011-12-23 09:27:26

回答

19

一個可能的原因可能是使用可選參數。

如果我們使用的是接口,那麼指定命名參數值是不可能的。舉個例子:

interface ITest 
{ 
    void Output(string message, int times = 1, int lineBreaks = 1); 
} 

class Test : ITest 
{ 

    public void Output(string message, int numTimes, int numLineBreaks) 
    { 
     for (int i = 0; i < numTimes; ++i) 
     { 
      Console.Write(message); 
      for (int lb = 0; lb < numLineBreaks; ++lb) 
       Console.WriteLine(); 
     } 

    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     ITest testInterface = new Test(); 
     testInterface.Output("ABC", lineBreaks : 3); 
    } 
} 

在此實現,使用接口時,則對timeslineBreaks默認參數,因此,如果通過接口訪問,也可以使用默認設置,無需指定的參數,我們將無法跳過times參數並只指定lineBreaks參數。

僅供參考,具體取決於您是通過接口訪問Output方法,還是通過類確定是否有默認參數,以及它們的值是什麼。

+0

接口在可選參數和命名參數之前存在。 :) – CodeCaster 2015-11-18 21:18:22

+0

@CodeCaster好喊,最有可能不是原來的原因,但它現在肯定是一個原因:)我猜測未來功能的可能性,如這是他們命名它們的原因。 – Lukazoid 2015-11-18 21:32:39

+0

@Lukazoid,做得很好。無論以何種方式來看,這都是最合乎邏輯的答案。 – 2017-07-22 14:48:41

9

我沒有看到任何理由會使這成爲技術要求。但我可以想到一個特別好的理由:

正如您所說,實現接口時不需要參數名稱,並且可以輕鬆地進行覆蓋。
但是,當使用接口時,想象一下如果沒有參數具有有意義的名字,那麼難度是多少!沒有智能,沒有提示,只有一種類型?呸。
這一直是名稱始終需要的最大原因。

+0

加上它使它與類中的方法聲明一致。 – Thilo 2011-12-23 09:32:04

+2

「如果沒有參數具有有意義的名字,想象一下難度!」 - 只需在Eclipse中編寫一些Java,大多數參數名稱都顯示爲「arg0」等等。 – Adam 2011-12-23 09:35:34

+1

@codesparkle這聽起來像閱讀縮小的JavaScript文件一樣有趣! – 2011-12-23 09:49:20

0

好的,這種可能性似乎太過輕浮,但 - 當你讓Visual Studio在屬性和方法中實現接口和存根時,它知道如何命名參數?

在另一方面,VS沒有問題一般命名控制...

1

我想不出任何有效的技術原因,接口必須有定義的名稱。

我可以很容易地看到名稱自動實現的情況,比如今天自動實現的屬性的後備成員。

不過,我認爲有可能就是他們一直需要3個主要的原因:

1)這是可能顯着更容易實現使用相同的規則實際方法在編譯器接口驗證。由於只是在最近才引入自動實現的屬性,我懷疑這是一個不小的編譯器更改。 2)對於那些支持在實現類(即VB)中自動創建接口成員的語言,使用預定義名稱創建接口實現可能容易得多,而不是試圖快速創建名稱。 3)由於接口可以暴露在定義應用程序之外,因此名稱可以消除與定義不準的接口相關的不明確性。

例如,試圖實現的接口方法:

void Foo(string, string, int) 

將最有可能導致比你的自我記錄例如實質上更多的混亂。但是,這實際上更像是一個接口可用性問題,而不是技術問題,但有人可能會爭辯說,如果接口不可用,則存在潛在的技術問題。

2

命名接口方法參數應用具有自文檔可幫助:

例如...

interface IRenderable 
{ 
    void Render(TimeSpan gameTime); 
} 

...說多:

interface IRenderable 
{ 
    void Render(TimeSpan); 
} 
相關問題