2012-06-08 26 views
7

Parece que no puedo encontrar una respuesta satisfactoria a esta pregunta de herencia. ¿Por qué declaras un subtipo como este a veces:C# declara la subclase como tipo superclase

Shape myCircle = new Circle(); 

y en otras ocasiones?

Circle myShape = new Circle(); 

Dónde Círculo es un/subclase niño de Shape .....

no parece que haya consistencia a través de los libros OO que he estado leyendo y una explicación I puede entender mi cabeza La gente me ha mostrado ejemplos de una clase de Shapes que está siendo instanciada para círculos, cuadrados, etc. Pero no entiendo cuando usas la primera declaración y la segunda.

Respuesta

3

Quizás tengas una lista de formas, y no te importa particularmente qué tipo de formas son, porque lo que tienes que hacer con esa lista es general para todas las formas (es decir, dibujar), querrás agregarlas a la lista como esta

List<Shape> shapeList = new List<Shape>(); 
shapeList.Add(new Circle()); 
shapeList.Add(new Rectangle()); 
foreach (Shape shape in shapeList) 
{ 
    shape.Draw(); 
} 

de esta manera se puede acceder a los métodos generales de las formas de los objetos que son realmente diferentes tipos, pero que comparten un antepasado común. Luego, si desea hacer algo específico para los círculos, puede usar la misma lista como esta.

foreach (Shape shape in shapeList) 
{ 
    if (!(shape is Circle)) continue; 
    Circle circle = shape as Circle; 
    circle.Radius = 100; 
} 
7

A menudo es deseable tratar objetos de la clase concreta polymorphically para evitar crear dependencias en tipos específicos donde se puede evitarlos. Por ejemplo, si está creando un Circle con la intención de dibujarlo, y Draw() es un método de Shape, entonces es mejor declarar myCircle como una forma, en caso de que decida reemplazarlo por un cuadrado más adelante.

Por otro lado, si su intención es hacer algo específico para Circle, por ejemplo, para establecer su radio, entonces tiene que declarar como myCircleCircle, porque SetRadius() pueden no estar disponibles en el Shape.

1

Además de la respuesta de @dasblinkenlight, utilizaría la primera declaración, en lugar de la segunda, porque desea restringir el comportamiento del objeto myCircle a los miembros Circle.

Eso es porque Circle es una subclase de Shape, y eso significaría que todos los miembros de Shape serán heredados por Circle, y, en algunos casos, porque estás usando C# (y sustituyendo los miembros no siempre es la regla, como en Java), anulada.

No se puede hacer lo contrario:

Circle myCircle = new Shape(); 

La razón se describe here.

De lo contrario, si está utilizando la segunda declaración, myCircle será un objeto Circle, utilizando los miembros y los métodos disponibles de Circle.

Cuestiones relacionadas