2010-08-09 17 views
9

¿Puedo crear una instancia de clase abstracta en C# /. Net como en Java?¿Existe una sintaxis para crear una subclase anónima en C#?

Información adicional

Creo que muchos de nosotros no entiende lo que quiero decir? Así, en Java que puedo crear clase abstracta como esto:

simple clase abstracta:

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

Código donde he crear instancia de clase abstracta

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

Can I hacer en C# algo como esto?

+6

Actualmente su pregunta es * muy * demasiado vaga. En particular, ha mencionado clases abstractas en el título y en las etiquetas, pero no en el cuerpo del texto. Si tiene en mente una parte específica del código de Java, publíquelo. –

+1

Mencionó una clase llamada "Abstact". Podría ser relevante. –

+0

No, clase Resumen es igual a abstracto :) – jitm

Respuesta

8

Ni en Java ni en C# puede crear una instancia de una clase abstracta. Siempre necesitará crear una clase concreta que herede de la clase abstracta. Java te permite hacerlo sin nombrar la clase, utilizando clases anónimas. C# no te da esa opción.

(Editado para mostrar un delegado como un reemplazo. No tengo acceso a VS aquí, por lo que no puede compilar, pero esta es la idea)

Por lo general, en Java cuando se utiliza una clase abstracta con un único método abstracto (SAM) lo que realmente está tratando de lograr es pasar algún código como parámetro. Digamos que necesita ordenar una matriz de objetos según el nombre de clase, utilizando Colecciones.sort (Colección, Comparador) (sé Comparador es una interfaz, pero es la misma idea) El uso de una clase anónima para evitar tener que escribir adicional, usted puede escribir algo como

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) 

En C# 2.0 y más allá de ti puede hacer más o menos lo mismo usando el delegado Comparison<T>. Un delegado puede pensarse como un objeto de función, o en palabras de Java, una clase con un único método. Ni siquiera necesita crear una clase, sino solo un método que utiliza la palabra clave delegado.

Comparison<Object> comparison = delegate(Object o1, Object o2) 
{ 
    return o1.class.Name.CompareTo(o2.class.Name);   
}; 

list.sort(comparison); 

En C# 3.0 y más allá se puede escribir menos código usando lambdas y la inferencia de tipos:

list.sort((o1, o2) => o1.class.Name.CompareTo(o2.class.Name)) 

De todos modos, si está migrando código de forma Java para C# usted debe leer acerca de los delegados ... en muchos casos, utilizará delegados en lugar de clases anónimas. En su caso, está utilizando un método nulo toDoSmth(). Hay un delegado llamado Acción que es más o menos lo mismo, un método sin parámetros y sin retorno.

+0

Sí, mi pregunta era ¿puedo crear una instancia como en java (usando anónima)? Actualmente entendí que no puedo. Gracias. – jitm

+2

En algunos (¿la mayoría?) Casos, debe reemplazar clases anónimas con delegados y escribirá incluso menos código ... Especialmente con un método de clases. –

+0

2 Pablo: Podría publicar un ejemplo de cómo hacerlo, porque actualmente he creado una clase simple a partir de un resumen y la uso. – jitm

8

No. No directamente. Lo más cerca que puede llegar (suponiendo que tiene la estructura siguiente de clase):

public abstract class AbstractClass 
{ 
} 

public class ChildClass : AbstractClass 
{ 
} 

es:

AbstractClass instance = new ChildClass(); 
0

Si usted está hablando de una clase abstracta, la respuesta es no. Son casi como las interfaces, pero permiten implementaciones que luego pueden ser utilizados por un objeto concreto .. debe crear una clase concreta que hereda de la clase abstracta

Ver más en Abstract Classes

+0

¡No publique enlaces de .NET 1.1! –

0

No, no se puede - es por eso que la clase se llama abstracta. Puede derivar de ello y crear clases concretas implementadas que puede crear instancias.

0

Lo que estás preguntando es un poco confuso. Si preguntas si puedes crear una instancia de una clase, entonces por supuesto que puedes. ¿Por qué C# o cualquier otro idioma le permitía definir una clase, pero no crear una instancia?

Si está preguntando si puede crear una instancia de una clase abstracta, la respuesta es no. Debe derivar una nueva clase de la clase abstracta, luego instanciar la nueva clase.

-1

C# es lo mismo que Java, en este caso, no puede instanciar una clase abstracta.

+0

En Java puedo, solo lo necesito es implementar métodos abstractos, pero puedo hacerlo como implementación anónima. – jitm

+0

En ese caso, entonces no - C# (hasta donde yo sé, no le permite crear una implementación anónima de una clase abstracta). – RQDQ

+0

Aún no está creando una instancia de la clase abstracta, está instanciando una subclase anónima. – Struan

Cuestiones relacionadas