Подтверждение участника и интерфейс - PullRequest
2 голосов
/ 25 августа 2011

Я был готов к тому, что метод Руби принудительно использует интерфейсы с динамической типизацией, проверив наличие методов / свойств, которые удовлетворяют интерфейсу.

Каким образом это в целом просто лучший принцип проектирования, чем использование интерфейсов? Какие плюсы / минусы. Например, вы можете реализовать ту же концепцию в 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 голос
/ 25 августа 2011

При таком подходе я вижу несколько серьезных проблем:

  1. отражение медленное
  2. динамические вызовы также намного медленнее, чем вызовы со строгой типизацией
  3. код более сложный

И я не вижу никаких преимуществ, кроме, возможно, очень специфических потребностей ...

C # был разработан как статический язык со строгой типизацией, инесмотря на то, что теперь у него есть некоторые динамические возможности, их следует использовать только в том случае, если нет строго типизированной альтернативы.

Если вам действительно нужно использовать объект динамически, не проверяйте члены вручную: вместо этого вставьтекод в блоке try и перехватывает RuntimeBinderException, который произойдет, если пропущенный вами член отсутствует.

...