Существует ли синтаксис для создания анонимного подкласса в C #?

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

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

I думаю, многие из нас не понимают, что я имею в виду? Итак, в 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 # что-то вроде этого ?

12
задан Steve Chambers 23 April 2013 в 16:21
поделиться

3 ответа

Ни в 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. Делегат можно представить как объект функции, или, говоря словами java, класс с единственным методом. Вам даже не нужно создавать класс, а только метод, используя ключевое слово delegate.

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

8
ответ дан 2 December 2019 в 21:42
поделиться

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

public abstract class AbstractClass
{
}

public class ChildClass : AbstractClass
{ 
}

Is:

AbstractClass instance = new ChildClass();
7
ответ дан 2 December 2019 в 21:42
поделиться

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

-3
ответ дан 2 December 2019 в 21:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: