2011-08-24 52 views
2

我已經準備好了Ruby的強制接口的方法,通過檢查滿足接口的方法/屬性是否存在動態類型。成員驗證vs接口

總體而言,採用什麼方式只是比使用接口更好的設計原則?有什麼優點/缺點。例如,你可以實現在C#中相同的概念,但我不知道這是否會具有相同的值,

public class Foo 
{ 
    public Foo(dynamic _obj) 
    { 
     MethodInfo[] methods= _obj.GetType().GetMethods(); 

     if (!methods.Any(x => x.Name == "SomeRequiredMethod") 
     { 
      throw new ArgumentException("Object does not meet interface requirements."); 
     } 
    } 

    // proceed with functionality that requires the method 
} 

當然,你可以擴展這不僅僅是名稱檢查較多,如簽名,返回類型等

想法?

回答

1

我可以看到這種方法的幾個重大問題的問題:

  1. 反射緩慢
  2. 動態調用也比強類型調用慢得多
  3. 的代碼更復雜

我看不到任何優勢,除了可能非常特殊的需求...

C#被設計爲一種靜態的強類型語言,儘管它現在有一些動態功能,但它們只能在沒有強類型選擇時使用。

如果您確實需要動態使用該對象,請不要手動檢查成員,而應將代碼放在try塊中,然後捕獲RuntimeBinderException,如果您致電的成員缺失,將發生這種情況。

+0

雖然Ruby中的情況如何,你知道是否有性能問題?我將它定爲39毫秒,我想這肯定會加起來。 –

+0

我對Ruby不太瞭解,但它是一種動態語言,所以它肯定更適合這種事情。你給的時間不是沒有上下文的非常有用的信息......我不知道你的方法做了什麼,以及你如何做了你的測試。 –