Ни в Java, ни в C # вы не можете создать экземпляр абстрактного класса.
Вам всегда нужно будет создать конкретный класс, который наследуется от абстрактного класса.
Java позволяет вам делать это без именования классов, используя анонимные классы. C # не дает вам такой возможности.
(отредактировано для отображения делегата в качестве замены. У меня нет доступа к VS здесь, поэтому он может не скомпилироваться, но это идея)
Обычно в Java, когда вы используете абстрактный класс с одним абстрактным методом (SAM), то, что вы действительно пытаетесь достичь, это передать некоторый код в качестве параметра.
Допустим, вам нужно отсортировать массив объектов на основе имени класса, используя Collections.sort (Collection, Comparator)
(Я знаю, что Comparator - это интерфейс, но это та же идея)
Используя анонимный класс, чтобы избежать дополнительной типизации, вы можете написать что-то вроде
Comparator<Object> comparator = new Comparator<Object>{
@Override
public int compare(Object o1, Objecto2) {
return o1.getClass().getSimpleName().compareTo(o2.getClass().getSimpleName()));
}//I'm not checking for null for simplicity
}
Collections.sort(list, comparator)
В C # 2.0 и выше вы можете сделать почти то же самое, используя делегат Comparison<T>
. Делегат можно представить как функциональный объект или, в словах Java, класс с одним методом. Вам даже не нужно создавать класс, а только метод, использующий ключевое слово делегат.
Comparison<Object> comparison = delegate(Object o1, Object o2)
{
return o1.class.Name.CompareTo(o2.class.Name);
};
list.sort(comparison);
В C # 3.0 и более поздних версиях вы можете написать еще меньше кода, используя лямбда-выражения и вывод типа:
list.sort((o1, o2) => o1.class.Name.CompareTo(o2.class.Name))
В любом случае, если вы переносите кодовую форму java на c #, вам следует прочитать об делегатах ... во многих случаях вы будете использовать делегаты вместо анонимных классов. В вашем случае вы используете метод void toDoSmth (). Есть делегат с именем Action, который почти идентичен, метод без параметров и без возврата.