2012-05-27 10 views
5

en Java, podemos anular o aplicar métodos abstractos sobre creación de la instancia de la siguiente manera:Invalidar método abstracto sobre creación de la instancia en C#

AbstractClass test =new AbstractClass() 
{ 
    public void AbstractMethod(string i) { 

    } 
    public void AbstractMethod2(string i) { 

    } 
}; 

Es esto posible en C#? En caso afirmativo, ¿cuál es el código equivalente

Gracias

Respuesta

8

Esta característica de Java se llama "anonymous class", no "una anulación del método de creación de la instancia". No hay una característica idéntica en C#.

C# tomó una ruta diferente: en lugar de proporcionar la sintaxis de conveniencia para la creación de subclases, amplió sus funciones de delegado, proporcionando anonymous delegates y lambdas. Lambdas te permite enchufar trozos de código.

0

No sé Java, pero este "huele" como Anonymous Types en C#.

Por ejemplo, puede escribir algo como:

var myNewType = new { 
         Name = "Charles", 
         Surname="Dickens", 
         Age = 55 
         }; 
+1

No, no tiene mucho en común con las clases anónimas, incluso si suenan similares. – Voo

2

Se puede lograr algo muy similar a través de un uso inteligente de lambdas:

public class BaseClass { 

    public BaseClass(Action<string> abs1 = null, Action<string> abs2 = null){ 
     AbstractMethod1 = abs1 ?? s=>{}; 
     AbstractMethod2 = abs2 ?? s=>{}; 
    } 

    public Action<string> AbstractMethod1 {get; private set;} 
    public Action<string> AbstractMethod2 {get; private set;} 
} 

lo que podría utilizar esta definición así:

new BaseClass(s=> Console.WriteLine(s), s=> Console.WriteLine(s)); 

También podría definir todos los métodos como parte de una interfaz y luego construir una clase con una implementación concreta de la interfaz (aproximando las llamadas a la implementación concreta) - Yo llamaría a eso el Patrón de "Estrategia". Pero eso es solo una variación de este tema.

+0

Esto es bueno, pero no algo que alguien que acaba de aprender C# debería pensar :) – TDaver

+0

@TDaver, las expresiones lambda han sido parte de .net por más de 4 años, están en todas partes. El autor está familiarizado con Java, que tiene una lambda, por lo que no es un concepto nuevo, solo una sintaxis ligeramente diferente (¿mejor?). –

+0

mientras estoy de acuerdo contigo en que las lambdas son buenas y deberían usarse (especialmente con LINQ), pero un principiante tiene dificultades para captar las consideraciones de diseño de clase de una clase base como la que estás sugiriendo :) – TDaver

Cuestiones relacionadas