Есть ли синтаксис для создания анонимного подкласса в C #? - PullRequest
12 голосов
/ 09 августа 2010

Могу ли я создать экземпляр класса abstract в C # /. Net, как в Java?

Дополнительная информация

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

Простой абстрактный класс:

/**
 * @author jitm
 * @version 0.1
 */
public abstract class TestAbstract
{
    public abstract void toDoSmth();
}

Код, в котором я создал экземпляр абстрактного класса

/**
 * @author jitm
 * @version 0.1
 */
public class Main {
    public static void main(String[] args) {
        TestAbstract testAbstract = new TestAbstract() {
            @Override
            public void toDoSmth() {
                System.out.println("Call method toDoSmth");
            }
        };
    }
}

Могу ли я сделать в c # что-то вроде этого?

Ответы [ 3 ]

8 голосов
/ 09 августа 2010

Ни в 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, который почти идентичен, метод без параметров и без возврата.

7 голосов
/ 09 августа 2010

Нет. Не напрямую. Ближе всего вы можете прийти (при условии, что у вас следующая структура класса):

public abstract class AbstractClass
{
}

public class ChildClass : AbstractClass
{ 
}

Есть:

AbstractClass instance = new ChildClass();
0 голосов
/ 09 августа 2010

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

...