2009-09-05 12 views
31

tengo esta interfaz:¿Cómo puedo hacer que un método sea privado en una interfaz?

public interface IValidationCRUD 
{ 
    public ICRUDValidation IsValid(object obj); 
    private void AddError(ICRUDError error); 
} 

Pero cuando lo uso (implementa la interfaz, la generación automática de código), me sale esto:

public class LanguageVAL : IValidationCRUD 
{ 
    public ICRUDValidation IsValid(object obj) 
    { 
     throw new System.NotImplementedException(); 
    } 

    public void AddError(ICRUDError error) 
    { 
     throw new System.NotImplementedException(); 
    } 
} 

El addError método es público y no privado como yo querido.

¿Cómo puedo cambiar esto?

+0

Me sorprende esta compilación, estoy seguro de que cuando estuve en 'piloto automático' mecleé una interfaz y agregué 'public' sin pensar que el compilador se ha quejado de mí. – Kirschstein

+1

No compila. No puede tener métodos privados en una interfaz, y ni siquiera está permitido especificar público, ya que está implícito para todos los miembros de una interfaz. –

+0

Acabo de escribir la interfaz y después intenté usarla en la otra clase. Visual Studio no lo compiló. – SmartStart

Respuesta

36

Una interfaz solo puede tener métodos públicos. Puede considerar el uso de una clase base abstracta con un método abstracto protegido AddError para esto. La clase base puede implementar la interfaz IValidationCRUD, pero solo después de haber eliminado el método privado.

así:

public interface IValidationCRUD 
{ 
    ICRUDValidation IsValid(object obj); 
} 

public abstract class ValidationCRUDBase: IValidationCRUD { 
    public abstract ICRUDValidation IsValid(object obj); 
    protected abstract void AddError(ICRUDError error); 
} 
+1

Una interfaz (bien formada) solo puede tener métodos públicos. Curiosamente, CLR admite constantes, campos e incluso constructores estáticos (tipo) para interfaces. Esto se debe a que una interfaz se implementa como cualquier otra definición de tipo. –

+0

Los campos en las interfaces no son CLS-compatibles, ¿no? – Botz3000

+1

Correcto. Las interfaces compatibles con CLS no pueden contener miembros estáticos porque los lenguajes como C# no pueden definirlos ni acceder a ellos. –

27

Un miembro privado no tiene sentido como parte de una interfaz. Una interfaz está ahí para definir un conjunto de métodos, un rol, un objeto siempre debe implementarse. Los métodos privados, por otro lado, son detalles de implementación, no destinados al consumo público.

+7

No puedes. Al especificar un modificador de acceso (privado o público) se genera un error de compilación. – JulianR

+0

Gracias, eso suena una campana. –

+0

Las interfaces deben verse como un mecanismo para hacer cumplir el contrato que una clase hace hacia los usuarios de la clase. Garantiza que los métodos X, Y, Z, ... siempre estarán disponibles para ser utilizados por usuarios externos de la clase. Sin embargo, lo que es molesto es que, en ocasiones, quiere ahorrarse la molestia de implementar métodos a los que los programadores de la clase tengan acceso cuando implementen la clase.Puede hacer esto heredando otra clase concreta o abstracta, pero como C# no admite herencia múltiple, no puede mezclar y combinar, por lo que deberá recurrir a la composición. –

1

El estado de una interfaz:

El CLR también permite una interfaz para contener estática métodos, campos estáticos, constantes y constructores estáticos. Sin embargo, una interfaz compatible con CLS no debe tener ninguno de estos miembros estáticos porque algunos lenguajes de programación no pueden definirlos ni acceder a ellos. De hecho, C# impide que una interfaz defina miembros estáticos. Además, el CLR no permite que una interfaz contenga ningún campo de instancia o constructor de instancia.

Estas son las reglas de una interfaz y no se puede hacer nada en ese :)

Estos no están permitidos

interface IIValidationCRUD 
{ 
    static ICRUDValidation IsValid(object obj); //error 
} 

interface IIValidationCRUD 
{ 
    public ICRUDValidation IsValid(object obj); //error 
} 
0

Ha considerado el uso:

void IValidationCRUD.AddError(ICRUDError error) 
    { 
     throw new System.NotImplementedException(); 
    } 

En lugar de

public void AddError(ICRUDError error) 
{ 
    throw new System.NotImplementedException(); 
} 

Siento asociarme demasiado tarde.

3

No es un escenario válido en caso real, pero aún así se puede lograr mediante la aplicación explícita de interfaz

interface Itest 
{ 
     void functiona(); 
     void functionb(); 
} 
class child : Itest 
{ 
    public void functiona() 
    { 
    } 
    void Itest.functionb() 
    { 
    } 
} 

aquí funciónB() se implimented explícitamente si ha creado el objeto del niño de clase te beneficias funciónB()

Cuestiones relacionadas