2012-03-19 4 views
9

Como sugiere el título de la pregunta, quiero agregar un Action<string> a una interfaz. es posible? Por el momento se dice Interfaces cannot contain fields¿Cómo se agrega una Acción <string> a una interfaz?

+0

Es un mal diseño agregar delegados a su contrato/interfaz. –

+0

@KirillPolishchuk ¿podría explicar/probar eso? – anatol

Respuesta

22

Se necesitaría para agregarlo como una propiedad:

public interface IYourInterface 
{ 
    Action<string> YourAction { get; set; } 
} 

Sin el get/set es sólo un campo, y como el compilador señala interfaces no puede contener campos . Esto quiere decir que cuando se implementa esta interfaz que necesita para abastecer a la propiedad real, así (aunque, obviamente, puede ser un simple auto-propiedad):

public class Foo : IYourInterface 
{ 
    public Action<string> YourAction { get; set; } 

    // ... 
} 

Teniendo en cuenta que, a continuación, puede utilizar su Action<string> de la interfaz:

IYourInterface iFoo = new Foo(); 

iFoo.YourAction = s => Console.WriteLine(s); 

iFoo.YourAction("Hello World!"); 

Como se indica Hans, se puede indicar en la interfaz sólo un get (o incluso sólo una set) si lo desea. Esto no significa que la clase no puede tener, sino que significa que no será accesible a través de la interfaz. Por ejemplo:

public interface IYourInterface 
{ 
    Action<string> YourAction { get; } 
} 

public class Foo : IYourInterface 
{ 
    public Action<string> YourAction { get; set; } 
} 

Así que en el código anterior, se puede acceder a la propiedad YourAction sólo como un get a través de la interfaz, pero se podía set o get desde la clase Foo.

+0

Como nota adicional: en una interfaz puede especificar que solo hay un "obtener": 'Acción YourAction {get; } ', dejando a la implementación cómo/si proporcionar un" conjunto ". –

+0

Muy cierto. Incluso puede especificar que solo tiene un conjunto (aunque esto es algo menos útil) –

0

Una interfaz no puede contener campos, pero pueden contener propiedades, por lo que podría agregarlo de esa manera.

0

cito:

"Interfaces consisten en métodos, propiedades, eventos, indizadores, o cualquier combinación de estos cuatro tipos de miembro Una interfaz no puede contener constantes, campos, operadores, constructores de instancia, destructores. ., o tipos no puede contener miembros estáticos son miembros Interfaces públicos automáticamente, y no puede incluir ningún modificador de acceso"

ya que la acción es un feild -. no podría ser una parte de la interfaz. http://msdn.microsoft.com/en-us/library/ms173156.aspx

+5

¿Quién dice que debe ser un campo? Podría ser una propiedad también. – rideronthestorm

Cuestiones relacionadas