web-dev-qa-db-ja.com

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

したがって、この方法を使用したい場合は、

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

それは私がしたいことをしますが、C#のベースクラスを扱う「ベース」キーワードがあります...派生クラスでいつベースキーワードを使用すべきかを本当に知りたいです...

良い例...

43
ACP

baseキーワードは、コンストラクターをチェーンするとき、または現在のクラスでオーバーライドまたは非表示になっている基本クラスのメンバー(メソッド、プロパティ、その他)にアクセスするときに基本クラスを参照するために使用されます。例えば、

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

これらの定義により、

new B().Bar();

出力します

I'm B
I'm A
62
Matti Virkkunen

機能をbaseするときにoverrideキーワードを使用しますが、オーバーライドされた機能も発生させます。

例:

 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;
     }
 }
8
Michael Buen

クラスに同じメンバーがあり、それがスーパークラスである場合、スーパークラスからメンバーを呼び出す唯一の方法-baseキーワードを使用:

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

baseキーワードは、サブクラスのメンバーによってオーバーライド(または非表示)された基本クラスのメンバーにアクセスするために使用されます。

例えば:

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

Bar.Testを呼び出すと、次が出力されます。

Foo.Baz;
Bar.Baz;
2
Will Vousden

Baseは、派生クラスのメソッドをオーバーライドするが、元の機能の上に追加機能を追加する場合にのみ使用されます

例えば:

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

     RunAdditionalProcess(); //Executes additional code
  }
1
Jasper

C#の「base」キーワードの本当の目的は次のとおりです。親クラスのパラメーター化されたコンストラクターのみを呼び出したい場合、baseを使用してパラメーターを渡すことができます。以下の例を参照してください...

例-

 class Clsparent
{
    public Clsparent()
    {
        Console.WriteLine("This is Clsparent class constructor");
    }
    public Clsparent(int a, int b)
    {
        Console.WriteLine("a value is=" + a + " , b value is=" + b);
    }
}
class Clschild : Clsparent
{
    public Clschild() : base(3, 4)
    {
        Console.WriteLine("This is Clschild class constructor");
    }
}
class Program
{
    static void Main(string[] args)
    {
        Clschild objclschild = new Clschild();
        Console.Read();
    }
}
0
Ajay Kaushik

Baseを使用して、オブジェクトの基本クラスのコンストラクターに値を入力できます。

例:

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

通常、基本クラスを使用して、基本クラスの子クラスのプロパティまたはメソッドを再利用するため、子クラスで同じプロパティとメソッドを再度繰り返す必要はありません。

ここで、baseキーワードを使用して、基本クラスからコンストラクターまたはメソッドを直接呼び出します。

public override void ParentMethod() 
  {
     base.ParentMethod(); //call the parent method

     //Next code.
  }

2)例

class child: parent
{
    public child() : base(3, 4) //if you have parameterised constructor in base class
    {

    }
}
0
Janmejay Kumar