2010-04-15 21 views

Respuesta

2

Una gran cantidad pasando aquí y me pregunto si esta es la tarea debido a la "IFoo", o tal vez hizo que el reemplazo para simplificar el ejemplo.

- : ServiceHostFactory, HostFactory hereda de ServiceHostFactory.

- HostFactory<TApp>, HostFactory es un tipo genérico ya que tiene un parámetro de tipo de TApp. Cada vez que alguien utiliza la clase HostFactory, puede especificar un tipo para TApp que hará que ese tipo se use en cualquier lugar donde TApp aparezca en el código. Así que si la clase tiene una función TApp GetApp() y especificar <int> de Tapp, entonces getapp es en realidad int GetApp()

- where TApp : IFoo, Tapp debe implementar la interfaz IFoo (esto podría haber sido una clase, así, lo que indica que debe heredar de la clase , no necesariamente directamente).

-abstract, HostFactory es una clase abstracta, es decir, otras clases pueden heredar de él, pero ningún código puede crear una instancia del HostFactory sí. Esto sería como si yo le diera el marco de un automóvil y le dijera que legalmente no tiene permiso para conducirlo en la carretera, pero puede hacer su propio automóvil.

- public HostFactory es público, lo que significa que es visible para codificar fuera del ensamblado en el que fue declarado.

Edición: Más sobre los genéricos voy a empezar con una cita muy significativa de MSDN: "Los genéricos son la característica más poderosa de C# 2.0."

Utilizaría genéricos cuando escriba algo que podría funcionar con muchos tipos. Por ejemplo, antes de tener genéricos en 2.0, teníamos que enviar todo a un objeto antes de que pudiéramos colocarlo en una colección, lo que era realmente peligroso porque el copper no podía verificar que estuvieras emitiendo el tipo correcto cada vez que obtuviste un elemento fuera de la colección. Con genéricos podemos hacer ArrayList<bool> para crear una ArrayList de bool's y ahora no hay necesidad de lanzar. El compilador puede verificar que estamos poniendo bool en la colección.

Por ejemplo, en la clase anterior podemos escribir algoritmos que funcionan con cosas que implementan IFoo, sabiendo solo que el objeto podrá hacer cosas que tiene una interfaz IFoo. Así que puedo escribir un algoritmo que invoca métodos en la interfaz IFoo, y luego mi algoritmo puede ser reutilizado en el futuro por cualquiera que implemente la interfaz IFoo.

+0

No tarea :) –

+0

@hmm Voy a tomar su palabra. Antes de responder, miré otras preguntas que me has hecho en el pasado y no parecías que eras ese tipo de persona :) – AaronLS

+0

En realidad, los genéricos me resultan confusos en cuanto a cuándo los usarías, etc. y esta sintaxis no familiar para mí tampoco (aunque mi suposición sobre los implementos era correcta, quería saber más sobre cómo y cuándo usarías esto). –

17

HostFactory es una clase genérica público (derivado de ServiceHostFactory) con un solo argumento de tipo genérico llamado TApp, donde cualquier suministra TApp debe implementar la IFoo interfaz (advertencia: el patrón IWhatever es simplemente una convención; IFoopodría sé una clase, supongo). El tipo HostFactory<TApp> no es de tipo concreto; debe tener subclases aún más a una instancia - presumiblemente por cosas como la siguiente (aunque una subclase genérica sería suficiente también):

public class BarHostFactory : HostFactory<Bar> {} 
public class Bar : IFoo {...} 
+0

Muy buena explicación. ¡Voto! – Kaili

+0

¡Gracias por explicar a Marc! –

2

Se dice HostFactory tiene un tipo genérico de TApp y que hereda de ServiceHostFactory y las señales where de palabras clave que TApp es un constrant.

En C# 2.0, utiliza la palabra clave where reserved para definir una restricción. Utilice la palabra clave where en el parámetro de tipo genérico seguido de un punto de derivación para indicar al compilador que el parámetro de tipo genérico implementa una interfaz particular.

http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx

+2

(nota al margen: 'where' tiene otros significados en una restricción genérica que simplemente" implementa una interfaz particular "- al menos 4 otros usos (': struct', ': class',': new() ' , ': SomeBaseType') –

Cuestiones relacionadas