C# base关键字用法解释(怎么理解)

2024-12-28 21:31:01
推荐回答(5个)
回答1:

1.用于从派生类中访问基类的成员:调用基类上已被其他方法重写的方法。

前半句实例:
public class Person
{
protected string ssn = "444-55-6666";
protected string name = "John L. Malgraine";

public virtual void GetInfo()
{
Console.WriteLine("Name: {0}", name);
Console.WriteLine("SSN: {0}", ssn);
}
}
class Employee : Person
{
public string id = "ABC567EFG";
public override void GetInfo()
{
// Calling the base class GetInfo method:
base.GetInfo();
Console.WriteLine("Employee ID: {0}", id);
}
}

class TestClass
{
static void Main()
{
Employee E = new Employee();
E.GetInfo();
}
}
后半句反例:
public class Person
{
protected string ssn = "444-55-6666";
protected string name = "John L. Malgraine";

public virtual void GetInfo()
{
Console.WriteLine("Name: {0}", name);
Console.WriteLine("SSN: {0}", ssn);
}
public virtual void GetInfo1()
{
Console.WriteLine("Name: {0}-1", name);
Console.WriteLine("SSN: {0}-1", ssn);
}
}
class Employee : Person
{
public string id = "ABC567EFG";

public override void GetInfo()
{
// Calling the base class GetInfo method:
base.GetInfo1(); //GetInfo1并没有被重写
Console.WriteLine("Employee ID: {0}", id);
}
}

class Program
{
static void Main(string[] args)
{
Employee E = new Employee();
E.GetInfo();

}
}

2.指定创建派生类实例时应调用的基类构造函数。

public class BaseClass
{
int num;

public BaseClass()
{
Console.WriteLine("in BaseClass()");
}

public BaseClass(int i)
{
num = i;
Console.WriteLine("in BaseClass(int i)");
}

public int GetNum()
{
return num;
}
}

public class DerivedClass : BaseClass
{
// This constructor will call BaseClass.BaseClass()
public DerivedClass()
: base()
{
}

// This constructor will call BaseClass.BaseClass(int i)
public DerivedClass(int i)
: base(i)
{
}

static void Main()
{
DerivedClass md = new DerivedClass();
DerivedClass md1 = new DerivedClass(1);
}
}

3.基类访问只能在构造函数、实例方法或实例属性访问器中进行。

记住不要在静态方法中使用base即可。语法上也通不过。It is an error to use the base keyword from within a static method.

回答2:

1.base其实最大的使用地方在面相对性开发的多态性上,base可以完成创建派生类实例时调用其基类构造函数或者调用基类上已被其他方法重写的方法。
例如:
2.关于base调用基类构造函数
public class
A
{
public
A()

{

Console.WriteLine("Build A");

}
}
public class B:A
{

public B():base()

{

Console.WriteLine("Build B");

}

static void Main()

{

B b = new
B();

Console.ReadLine();

}
}
创建一个B的实例对象,获得结果是同时打印Build A和Build B.

3.关于base在派生类中调用基类的方法。
public class
A
{
public virtual void
Hello()

{

Console.WiriteLine("Hello");

}
}
public class B : A
{

public override void Hello()

{

base.Hello();//调用基类的方法,显示Hello

Console.WiriteLine("World");

}
}
这样如果程序调用B.Hello()获得的效果将会使Hello World.

最后补充下,根据MSDN
Library介绍来看这两个关键字都是属于[访问关键字]类型

4.关于base
base
关键字用于从派生类中访问基类的成员:
调用基类上已被其他方法重写的方法。
指定创建派生类实例时应调用的基类构造函数。
基类访问只能在构造函数、实例方法或实例属性访问器中进行。

示例:
5.
在派生类中调用基类方法。

using
System;
public class BaseClass
{
protected string
_className = "BaseClass";
public virtual void
PrintName()

{
Console.WriteLine("Class Name:
{0}", _className);
}
}
class DerivedClass :
BaseClass
{
public string _className =
"DerivedClass";
public override void
PrintName()

{
Console.Write("The BaseClass
Name is {0}");

//调用基类方法

base.PrintName();

Console.WriteLine("This DerivedClass is {0}", _className);

}
}
class TestApp
{
public static void
Main()
{

DerivedClass dc = new
DerivedClass();

dc.PrintName();
}
}

6.
在派生类中调用基类构造函数。
// keywords_base2.cs
using System;
public class
BaseClass
{
int num;
public
BaseClass()

{
Console.WriteLine("in
BaseClass()");
}
public
BaseClass(int i)

{
num =
i;
Console.WriteLine("in
BaseClass(int {0})", num);
}
}
public class
DerivedClass : BaseClass
{
// 该构造器调用
BaseClass.BaseClass()
public
DerivedClass()
:
base()
{
}
//
该构造器调用 BaseClass.BaseClass(int i)
public DerivedClass(int
i)
: base(i)

{
}
static void
Main()
{

DerivedClass dc = new
DerivedClass();
DerivedClass dc1 =
new DerivedClass(1)();

Console.ReadLine();
}
}

7.注意:
从静态方法中使用 base
关键字是错误的。
base 主要用于面向对象开发的对态这方面,在示例2中有体现。

回答3:

1.用于从派生类中访问基类的成员:调用基类上已被其他方法重写的方法
这句话表述是错误的,起码是不准确.
应该是这样,
可以调用基类(父类)中所有可访问的成员 ,包括方法,属性,成员变量,索引器,事件.
可访问的,不包括private,其他的如public,protected,internal,protected internal都可以,就是private不可以.
没有被重写的方法,只要不是private,100%可以调用.

其他2点,你是学java的,应该不解释了.
---------
ps:如果你上面3点是从书上找的,那这书真是误人子弟.

回答4:

上面3句分别怎么理解,尤其是第1句,为什么是调用基类上已被其他方法重写的方法。难道,没有被重写的方法不行?
没有被重写的方法也是可以的!不是private访问修饰符的属性或方法都可以访问。
加了base就是指明要访问基类中的某个属性或方法.
例子
BasicClass//基类
{
protect int width;
public virtual void SetWidth(int w))//给width赋值(虚方法可重写)
{
width=w;
}
}

ChildClass:BasicClass
{
public override void SetWidth(int w)//给width赋值(重写基类的赋值方法)
{
base.width=w;
}
public void ChildSetWidth(int w)//给width赋值(调用基类的方法)
{
base.SetWidth(w);
}
}

回答5:

继承.就是像"子承父"的关系.用这个关键字就能用基类里的东西,同时也可写自己的方法