2011-08-24 56 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不太了解,但它是一种动态语言,所以它肯定更适合这种事情。你给的时间不是没有上下文的非常有用的信息......我不知道你的方法做了什么,以及你如何做了你的测试。 –