2010-08-09 15 views
9

Posso creare istanza di astratta in classe in C# /. Net come in Java?Esiste una sintassi per la creazione di una sottoclasse anonima in C#?

Altre Informazioni

Penso che molti di noi non capisce cosa voglio dire? Così, in Java ho posso creare classe astratta come questo:

Semplice classe astratta:

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

codice dove ho creo istanza della classe astratta

/** 
* @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"); 
      } 
     }; 
    } 
} 

che posso per fare in C# qualcosa di simile?

+6

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. –

+1

Ha menzionato una classe chiamata "Abstact". Potrebbe essere rilevante. –

+0

No, classe Abstract è uguale a abstract :) – jitm

risposta

8

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.

+0

Sì, la mia domanda era: posso creare istanze come in java (usando anonimo) attualmente ho capito che non posso. Grazie. – jitm

+2

In alcuni casi (più?), È necessario sostituire le classi anonime con i delegati e scrivere meno codice ... Specialmente con le classi di un metodo. –

+0

2 Pablo: potresti postare un esempio su come farlo, perché attualmente ho creato una classe semplice da astratta e la uso. – jitm

8

No. Non direttamente. Il più vicino si può venire (ammesso che abbiate la seguente struttura di classe):

public abstract class AbstractClass 
{ 
} 

public class ChildClass : AbstractClass 
{ 
} 

Is:

AbstractClass instance = new ChildClass(); 
0

Se si sta parlando di una classe astratta, la risposta è no. Sono quasi come le interfacce, ma permettono implementazioni che possono poi essere utilizzati da un oggetto concreto .. è necessario creare una classe concreta che eredita dalla classe astratta

saperne di più visita Abstract Classes

+0

Si prega di non pubblicare i collegamenti .NET 1.1! –

0

No, non è possibile - è per questo che la classe è chiamata astratta. Puoi derivarne e creare così delle classi concrete implementate che puoi istanziare.

0

Quello che chiedi è un po 'di confusione. Se stai chiedendo se è possibile creare un'istanza di una classe, ovviamente è possibile. Perché C# o qualsiasi linguaggio ti consentono di definire una classe, ma non di istanziarla?

Se si chiede se è possibile creare un'istanza di una classe astratta, la risposta è no. È necessario derivare una nuova classe dalla classe astratta, quindi creare un'istanza della nuova classe.

-1

C# è lo stesso di Java in questo caso, non è possibile creare un'istanza di una classe astratta.

+0

In Java posso, solo che ne ho bisogno è implementare metodi astratti, ma, posso farlo come un'implementazione anonima. – jitm

+0

In questo caso, quindi no - C# (per quanto ne so non ti permette di creare un'implementazione anonima di una classe astratta). – RQDQ

+0

Non si sta ancora istanziando la classe astratta, si sta creando un'istanza di una sottoclasse anonima. – Struan

Problemi correlati