2011-07-29 7 views
5

¿Cuál es el escenario de la vida real donde usaremos nuevo para proporcionar una nueva implementación para un método virtual en la clase derivada? C#Uso de la vida real de la nueva palabra clave para ocultar la implementación del método virtual? C#

Sé lo que significa técnicamente. lo que estoy buscando es un escenario de la vida real donde esto sea necesario.

Siempre podemos lograr lo mismo proporcionando la funcionalidad de anulación. ¿Por qué querríamos que el método incorrecto fuera elegido cuando la llamada a los métodos se realiza a la base?

+0

mejor discuta en http://programmers.stackexchange.com/ –

Respuesta

6

No. No puede lograr lo mismo.

// Define the base class 
class Car 
{ 
    public virtual void DescribeCar() 
    { 
     System.Console.WriteLine("Four wheels and an engine."); 
    } 
} 

// Define the derived classes 
class ConvertibleCar : Car 
{ 
    public new virtual void DescribeCar() 
    { 
     base.DescribeCar(); 
     System.Console.WriteLine("A roof that opens up."); 
    } 
} 

class Minivan : Car 
{ 
    public override void DescribeCar() 
    { 
     base.DescribeCar(); 
     System.Console.WriteLine("Carries seven people."); 
    } 
} 

Ahora, si intenta hacer esto:

public static void TestCars2() 
{ 
    Car[] cars = new Car[3]; 
    cars[0] = new Car(); 
    cars[1] = new ConvertibleCar(); 
    cars[2] = new Minivan(); 
} 

El resultado será:

Car object: YourApplication.Car 

Four wheels and an engine. 

---------- 

Car object: YourApplication.ConvertibleCar 

Four wheels and an engine. 

---------- 

Car object: YourApplication.Minivan 

Four wheels and an engine. 

Carries seven people. 

---------- 

anulación anular SIEMPRE mientras que el nuevo sólo lo hace cuando se utiliza como su tipo declarado (no la base uno).

Puede see more here

+1

Estaba buscando escenerio de la vida real ... y este es para el libro .. de todos modos ... base de datos fragilidad dada por Jon responde – ParvindS

4

No, no puede lograr el mismo anulando:

  • Especificación de un nuevo método permite variar el tipo de retorno
  • Al llamar al método de base no puede ser incorrecto

Uno ex un amplio escenario:

  • Estás usando tercera biblioteca de partido Foo, que contiene una clase FooBase
  • usted escribe su propia subclase de Foo, Bar
  • se introduce un método público en bar llamado HacerAlgo
  • En la próxima versión de Foo, el tercero introduce un método DoSomething en Foo que no hace lo mismo que su método. Esto puede ser virtual o no.

En este punto, donde todas sus existente código de llamada Bar.DoSomething a todavía Bar.DoSomething llamada, pero todo el código que llama a Foo.DoSomething todavía debe llamar a que la aplicación - esas personas que llaman no pueden incluso sepa acerca de su método, y pueden estar en el ensamblado de terceros.

A largo plazo en esa situación, es probable que desee cambiar el nombre de su método si puede (dependiendo de la cantidad de control que tenga sobre las personas que llaman) pero a corto plazo, haciendo que su método como new logre exactamente el comportamiento que querer.

Este tipo de cosas a veces se conoce como el problema clase base frágil. Eric Lippert ha escrito sobre ello de forma razonablemente extensiva, incluido el this post back in 2004.

0

Se puede redefinir un método virtual. La palabra clave virtual designa un método que se reemplaza en las clases derivadas. Podemos agregar tipos derivados sin modificar el resto del programa. El tipo de objetos de tiempo de ejecución determina el comportamiento.

Cuestiones relacionadas