Могу ли я создать экземпляр класса 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 # что-то вроде этого ?
Ни в 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, который представляет собой практически то же самое, метод без параметров и без возврата.
Нет. Не прямо. Ближайшее из возможных (при условии, что у вас следующая структура классов):
public abstract class AbstractClass
{
}
public class ChildClass : AbstractClass
{
}
Is:
AbstractClass instance = new ChildClass();
C # - это то же самое, что и Java, в этом случае вы не можете создать экземпляр абстрактного класса.