Né in Java né in C# è possibile creare un'istanza di una classe astratta. Sarà sempre necessario creare una classe concreta che erediti dalla classe astratta. Java consente di farlo senza nominare la classe, utilizzando classi anonime. C# non ti dà questa opzione.
(A cura di mostrare un delegato in sostituzione. Non ho accesso a VS qui, in modo che non può compilare, ma questa è l'idea)
Di solito in Java quando si utilizza una classe astratta con un singolo metodo astratto (SAM), quello che stai cercando di ottenere è passare un codice come parametro. Supponiamo che sia necessario ordinare una matrice di oggetti in base al nome della classe, utilizzando Raccolte.sort (Collezione, comparatore) (lo so comparatore è un'interfaccia, ma è la stessa idea) Utilizzando una classe anonima per evitare di digitare in più, è possibile scrivere qualcosa di simile
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)
In C# 2.0 e oltre si può fare praticamente lo stesso usando il delegato Comparison<T>
. Un delegato può essere pensato come un oggetto funzione, o in java words, una classe con un singolo metodo. Non è nemmeno necessario creare una classe, ma solo un metodo che utilizza la parola chiave delegato.
Comparison<Object> comparison = delegate(Object o1, Object o2)
{
return o1.class.Name.CompareTo(o2.class.Name);
};
list.sort(comparison);
In C# 3.0 e oltre è possibile scrivere anche meno codice usando lambda e inferenza di tipo:
list.sort((o1, o2) => o1.class.Name.CompareTo(o2.class.Name))
In ogni caso, se si esegue la migrazione codice del modulo Java a C# si dovrebbe leggere sui delegati ... in molti casi userete delegati invece di classi anonime. Nel tuo caso, stai utilizzando un metodo void toDoSmth(). C'è un delegato chiamato Action che è praticamente la stessa cosa, un metodo senza parametri e senza ritorno.
Attualmente la tua domanda è * lontano * troppo vaga. In particolare, hai menzionato le classi astratte nel titolo e nei tag, ma non nel corpo del testo. Se hai in mente un particolare codice Java, per favore pubblicalo. –
Ha menzionato una classe chiamata "Abstact". Potrebbe essere rilevante. –
No, classe Abstract è uguale a abstract :) – jitm