2010-04-15 10 views
37

Zatem używanych klasy bazowej dla niektórych Commom metod wielokrotnego użytku na każdej stronie mojej aplikacji ...Co tak naprawdę jest celem słowa kluczowego "base" w języku 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); 
    } 
} 

Więc jeśli chcę korzystać z tej metody i byłoby po prostu zrobić,

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); 
     } 
} 

Czyni co chcę, ale istnieje słowo kluczowe "Base", która zajmuje się klasy bazowej w języku C# ... Naprawdę chcę wiedzieć, kiedy należy użyć słowa kluczowego podstawowego w mojej klasy pochodnej ....

Każdy dobry przykład ...

Odpowiedz

55

Słowo kluczowe base używane jest w odniesieniu do klasy bazowej podczas łączenia konstruktorów lub gdy użytkownik chce uzyskać dostęp do elementu (metody, właściwości, czegokolwiek) w klasie bazowej, która została nadpisana lub ukryta w bieżącej klasie. Na przykład,

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(); 
    } 
} 

Z tych definicji,

new B().Bar(); 

byłoby wyjście

I'm B 
I'm A 
+6

nie jest ograniczone do funkcji. Wszędzie tam, gdzie istnieje niejednoznaczność na zajęciach (rodzic i dzieci), podstawowe słowo kluczowe wyjaśnia, która metoda/członek danych, o którym mówi użytkownik. – Nayan

+1

@Nayan: Dobra uwaga. Zmieniony, by zamiast tego mówić o członku. –

+0

Czy 'A.Foo()' robi to samo co 'base.Foo()'? –

0

bazowa jest używana podczas przesłonić metodę w klasie pochodnej, ale po prostu chcesz dodać dodatkowe funkcje na górna część oryginalnej funkcjonalności

Na przykład:

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

    RunAdditionalProcess(); //Executes additional code 
    } 
6

Jeśli masz ten sam element w klasie i to jest super klasy, jedynym sposobem, aby zadzwonić członka z super klasy - Korzystanie base kluczowe:

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

base słów kluczowych służy do członków dostępowych w klasie bazowej, które zostały nadpisane (lub ukryte) przez członków w podklasie.

Na przykład:

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(); 
    } 
} 

Wywołanie Bar.Test będzie wtedy wyjście:

Foo.Baz; 
Bar.Baz; 
5

base Państwo użyje słowa kluczowego kiedy override funkcjonalność, ale nadal chcesz przesłonięte funkcjonalność występuje również.

przykład:

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 dla if (isHit) {usuń i i nabiera zupełnie innego znaczenia};) – andrewWinn

+0

@andrewWinn: to może być główny powód, dla którego projektanci języka C# nie mogą wprowadzić słowa kluczowego IsNot VB.NET do języka C#. Będzie wyglądać na boogera :-D heheh –

0

można wykorzystywać bazę do wypełnienia wartości w konstruktorze klasy bazowej obiektu.

przykład:

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); 
    } 
} 
Powiązane problemy