2010-04-15 8 views
37

lo tanto para la clase base que se utiliza para algunos métodos reutilizables commom en todas las páginas de mi solicitud ...¿Cuál es realmente el propósito de la palabra clave "base" en C#?

public class BaseClass:System.Web.UI.Page 
{ 
    public string GetRandomPasswordUsingGUID(int length) 
    { 
     string guidResult = System.Guid.NewGuid().ToString(); 
     guidResult = guidResult.Replace("-", string.Empty); 
     return guidResult.Substring(0, length); 
    } 
} 

Así que si quiero usar este método me acaba de hacer,

public partial class forms_age_group : BaseClass 
{ 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      //i would just call it like this 
      string pass = GetRandomPasswordUsingGUID(10); 
     } 
} 

Lo hace lo que quiero pero hay una palabra clave "Base" que trata con la clase base en C# ... Realmente quiero saber cuándo debo usar la palabra clave base en mi clase derivada ...

Cualquier buen ejemplo ...

Respuesta

55

La palabra clave base se utiliza para referirse a la clase base al encadenar constructores o cuando desea acceder a un miembro (método, propiedad, cualquier cosa) en la clase base que se ha sobrescrito u ocultado en la clase actual. Por ejemplo,

class A { 
    protected virtual void Foo() { 
     Console.WriteLine("I'm A"); 
    } 
} 

class B : A { 
    protected override void Foo() { 
     Console.WriteLine("I'm B"); 
    } 

    public void Bar() { 
     Foo(); 
     base.Foo(); 
    } 
} 

Con estas definiciones,

new B().Bar(); 

habría salida

I'm B 
I'm A 
+6

No se limita a las funciones. Siempre que exista ambigüedad en las clases (padres e hijos), la palabra clave básica aclara de qué método/miembro de datos habla el usuario. – Nayan

+1

@Nayan: Buen punto. Revisado para decir miembro en su lugar. –

+0

¿'A.Foo()' haría lo mismo que 'base.Foo()'? –

0

base se utiliza cuando se reemplaza un método en una clase derivada, pero sólo quieren añadir funcionalidad adicional en parte superior de la funcionalidad original

Por ejemplo:

// Calling the Area base method: 
    public override void Foo() 
    { 
    base.Foo(); //Executes the code in the base class 

    RunAdditionalProcess(); //Executes additional code 
    } 
6

Si tiene el mismo miembro de la clase y es super clase, la única manera de miembro de la superclase llamar - usando base palabra clave:

protected override void OnRender(EventArgs e) 
{ 
    // do something 

    base.OnRender(e); 

    // just OnRender(e); will bring a StakOverFlowException 
    // because it's equal to this.OnRender(e); 
} 
2

La palabra clave base se utiliza para los miembros de acceso en la clase base que los miembros de la subclase han reemplazado (u ocultado).

Por ejemplo:

public class Foo 
{ 
    public virtual void Baz() 
    { 
     Console.WriteLine("Foo.Baz"); 
    } 
} 

public class Bar : Foo 
{ 
    public override void Baz() 
    { 
     Console.WriteLine("Bar.Baz"); 
    } 

    public override void Test() 
    { 
     base.Baz(); 
     Baz(); 
    } 
} 

Calling Bar.Test sería entonces la salida:

Foo.Baz; 
Bar.Baz; 
5

que va a utilizar base palabra clave cuando se override una funcionalidad pero aún desea la funcionalidad reemplazado a ocurrir también.

ejemplo:

public class Car 
{ 
    public virtual bool DetectHit() 
    { 
     detect if car bumped 
     if bumped then activate airbag 
    } 
} 


public class SmartCar : Car 
{ 
    public override bool DetectHit() 
    { 
     bool isHit = base.DetectHit(); 

     if (isHit) { send sms and gps location to family and rescuer } 

     // so the deriver of this smart car 
     // can still get the hit detection information 
     return isHit; 
    } 
} 


public sealed class SafeCar : SmartCar 
{ 
    public override bool DetectHit() 
    { 
     bool isHit = base.DetectHit(); 

     if (isHit) { stop the engine } 

     return isHit; 
    } 
} 
+0

+1 para if (isHit) {eliminar el i y toma un significado completamente diferente};) – andrewWinn

+0

@andrewWinn: esa podría ser la razón principal por la cual los diseñadores de lenguaje C# no pueden introducir la palabra clave IsNot de VB.NET al lenguaje C#. Tendrá una apariencia de booger :-D heheh –

0

Se puede utilizar la base para llenar los valores en el constructor de la clase base de un objeto.

Ejemplo:

public class Class1 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public DateTime Birthday { get; set; } 

    public Class1(int id, string name, DateTime birthday) 
    { 
     ID = id; 
     Name = name; 
     Birthday = birthday; 
    } 
} 

public class Class2 : Class1 
{ 
    public string Building { get; set; } 
    public int SpotNumber { get; set; } 
    public Class2(string building, int spotNumber, int id, 
     string name, DateTime birthday) : base(id, name, birthday) 
    { 
     Building = building; 
     SpotNumber = spotNumber; 
    } 
} 

public class Class3 
{ 
    public Class3() 
    { 
     Class2 c = new Class2("Main", 2, 1090, "Mike Jones", DateTime.Today); 
    } 
} 
Cuestiones relacionadas