2010-07-08 6 views
7

Todos los miembros de una interfaz son públicos por defecto. Pero hay algunas propiedades en mi interfaz que quiero que se utilicen como miembros privados de algunas subclases que implementan mi interfaz. ¿Es esto algo que puede y está hecho o estoy fuera de lugar aquí? Estoy trabajando en el uso de más interfaces en mi arquitectura en estos días, así que aún no estoy tan versado.Implementar una interfaz pero cambiar un miembro para que sea privado

+4

¿Ha considerado utilizar una implementación de interfaz explícita? –

+0

Parece muy similar a http://stackoverflow.com/questions/17576/non-public-members-for-c-interfaces – Mathias

+3

¡Utilice la clase abstracta instate de la interfaz! – Jalal

Respuesta

12

El objetivo de las interfaces es que proporcionan un contrato que otros objetos pueden usar para comunicarse con su objeto. Si cambia un miembro que está declarado como public en una interfaz al private, entonces no está cumpliendo el contrato; es posible que otro objeto necesite leer esa propiedad/llamada de ese método, y usted debe permitirlo.

Una interfaz nunca tendrá private miembros como una interfaz es para "interfaz" entre dos objetos. Sus miembros internos private no le importan, siempre y cuando mantenga su final del contrato.

+0

"El objetivo de las interfaces es que proporcionan un contrato que otros objetos pueden usar para comunicarse con su objeto". ¿Qué quiere decir específicamente con "su objeto" – PositiveGuy

+0

El objeto que está implementando la interfaz (suponía que esta es la que estaba escribiendo). – Donnie

+0

Vale la pena mencionar que Microsoft viola esta misma regla. Si observa las clases KeyCollection o ValueCollection que forman parte del diccionario genérico principal, verá que implementan ICollection y, sin embargo, muchos de los métodos de interfaz están marcados como privados. Haz de eso lo que quieras. – WiredWiz

1

Tiene que comprender completamente qué son las interfaces. De hecho, solo hay descripciones de las expectativas que el mundo exterior podría tener sobre los miembros de la clase. No crea el miembro, simplemente informa que la clase especificada tiene un método específico para usar en el ámbito público. Entonces, como puedes ver por interfaz, solo puedes describir miembros públicos.

Por otro lado, si desea declarar algunos miembros privados que son fijos o virtuales, puede usar la herencia clásica con la clase base abstracta. En este caso, hará que todos los métodos que desee implementar en subclases sean abstractos e implementará los métodos que desee definir en la clase base.

Espero que esto ayude .. recuerdos

+0

Sí, entiendo lo que son .... hay mucho más para responder a mi pregunta, pero es demasiado para explicar. – PositiveGuy

+0

gracias por la buena descripción sobre el uso de una clase base para implementar miembros de la interfaz. Eso ayuda mucho. – PositiveGuy

+0

Bueno, no solo el mundo exterior. Puede usar Interfaces para crear la estructura requerida y mantener una estructura consistente en una capa de aplicación. Además, dado que siempre debe probar la unidad a través de interfaces, entonces debe tener una interfaz para cada clase ... por lo tanto, no es solo la reutilización del código aquí o la exposición de la funcionalidad al mundo exterior a través de una abstracción ... hay muchas otras razones por las cuales usaría una interfaz si no está exponiendo una capa de interfaz al mundo exterior ¿No estoy en lo cierto? – PositiveGuy

2

El ir en su pregunta, y su uso de la palabra "subclase", no creo que has entendido plenamente Interfaces todavía.

Sé que probablemente ha escuchado esto un millón de veces, pero una interfaz describe lo que hace un objeto, y una clase es CÓMO lo hace. Una clase IMPLEMENTS, una interfaz, no INHERTA de ella.

Así que, si lo desea, tenga una interfaz para su clase base, o para sus SubClasses, pero su pregunta me hace pensar que está pensando en una clase base (clase abstracta), no en una interfaz.

¿Tiene sentido?

+0

Sí, lo entiendo. Entonces, cree una interfaz para sus clases abstractas es una opción entonces. – PositiveGuy

+0

Quiero un contrato que otras implementaciones tengamos este mismo patrón así que las interfaces que estoy creando son una funcionalidad común que se implementan de manera diferente por tipo de aplicación que estamos construyendo usando estas interfaces, lo cual tiene mucho sentido al menos usar una Interfaz de una clase abstracta porque estoy creando un conjunto de interfaces para envolturas de servicios web para usar en varias API de terceros – PositiveGuy

1

Las interfaces solo son buenas para el público. Internamente, sería extraño que un objeto se refiera a sí mismo a través de una interfaz.

Si desea tener variables privadas que fuerce una implementación de, desea utilizar una clase abstracta y marcarlas como protegidas.

2

Como la interfaz no tiene un Modificador de acceso, si aún desea que su método sea privado en la clase que implementa esa interfaz, puede Implementar esa interfaz EXPLICITAMENTE.

De esta forma, los métodos de su clase serán Privados.

0

pensar un poco sobre esto - y que entienden que esto no se puede hacer:

interfaces son como un contacto. todos los campos públicos de la interfaz son partes del contacto.

Entonces, no puede ocultarlos en una subclase ...
¿Qué pasaría si alguien subiera el objeto de clase al tipo de interfaz?

Probablemente desee cambiar su diseño; ¿puede dividir su interfaz en dos interfaces? oy una interfaz y una clase abstracta? necesitamos más detalles para saber ...

Cuestiones relacionadas