Подтвердить что ты не робот

С# анонимно реализует интерфейс (или абстрактный класс)

В Java можно расширить интерфейс с анонимным классом, который можно реализовать "на лету". Пример:

Runnable myRunnable = new Runnable()
{
    @Override
    public void run() { /**/ }
}

(Подробнее: http://www.techartifact.com/blogs/2009/08/anonymous-classes-in-java.html#ixzz1k07mVIeO)

Возможно ли это в С#? Если нет, то какие жизнеспособные альтернативы не должны полагаться на реализацию множества подклассов?

4b9b3361

Ответ 1

Нет, вы не можете сделать это на С#, но обычно альтернативный подход к дизайну заключается в использовании делегата. В примере, который вы указали, Runnable обычно представляется с помощью ThreadStart, и вы можете использовать анонимный метод или выражение лямбда:

ThreadStart start = () =>
{
    // Do stuff here
};

Или, если у вас только есть метод для запуска, с правой подписью вы можете использовать преобразование группы методов:

ThreadStart start = MethodToRunInThread;

Или в вызове конструктора Thread:

Thread t = new Thread(MethodToRunInThread);
t.Start();

Если вам действительно нужно реализовать интерфейс, вам нужно будет его реализовать (возможно, в частном вложенном классе). Тем не менее, это не очень часто происходит на С#, по моему опыту - обычно интерфейсы С# - это такие, которые, естественно, потребуют "реальной" реализации, даже в Java.

Ответ 2

Как указал Джон, это невозможно в С#.

Один альтернативный шаблон в С#, однако, должен использовать комбинацию factory и делегата, чтобы позволить на практике реализовать интерфейс. По существу, factory принимает делегата для каждого метода интерфейса и использует их в качестве поддержки. Например, здесь версия для IComparable<T>.

public static class ComparableFactory {
  private sealed ComparableImpl<T> : IComparable<T> {
    internal Func<T, T, int> _compareFunc;
    public int Compare(T left, T right) {
      return _compareFunc(left, right);
    }
  }
  public IComparable<T> Create<T>(Func<T, T, int> compareFunc) {
    return new ComparableImpl<T>() { _compareFunc = compareFunc };
  }
}

...

IComparable<Person> impl = CompareableFactory.Create<Person>(
  (left, right) => left.Age.CompareTo(right.Age));