С# анонимно реализует интерфейс (или абстрактный класс)
В Java можно расширить интерфейс с анонимным классом, который можно реализовать "на лету". Пример:
Runnable myRunnable = new Runnable()
{
@Override
public void run() { /**/ }
}
(Подробнее: http://www.techartifact.com/blogs/2009/08/anonymous-classes-in-java.html#ixzz1k07mVIeO)
Возможно ли это в С#? Если нет, то какие жизнеспособные альтернативы не должны полагаться на реализацию множества подклассов?
Ответы
Ответ 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));