永发信息网

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

答案:5  悬赏:0  手机版
解决时间 2021-02-22 17:19
  • 提问者网友:浮克旳回音
  • 2021-02-22 13:24
C# base关键字用法
1.用于从派生类中访问基类的成员:调用基类上已被其他方法重写的方法。
2.指定创建派生类实例时应调用的基类构造函数。
3.基类访问只能在构造函数、实例方法或实例属性访问器中进行。
-----------------------------------------------------------------
上面3句分别怎么理解,尤其是第1句,为什么是调用基类上已被其他方法重写的方法。
难道,没有被重写的方法不行?这点与java里的super好像差异比较大,javali里super可以用来掉父类的字段,父类的方法,
---------------------------------------------------
希望高手详细解答
这是微软官方文档摘抄下来的三句话,尤其第一句不理解
最佳答案
  • 五星知识达人网友:患得患失的劫
  • 2021-02-22 13:29
1.用于从派生类中访问基类的成员:调用基类上已被其他方法重写的方法
这句话表述是错误的,起码是不准确.
应该是这样,
可以调用基类(父类)中所有可访问的成员 ,包括方法,属性,成员变量,索引器,事件.
可访问的,不包括private,其他的如public,protected,internal,protected internal都可以,就是private不可以.
没有被重写的方法,只要不是private,100%可以调用.

其他2点,你是学java的,应该不解释了.
---------
ps:如果你上面3点是从书上找的,那这书真是误人子弟.
全部回答
  • 1楼网友:枭雄戏美人
  • 2021-02-22 16:50
调用父类已经被子类覆盖的方法
  • 2楼网友:一秋
  • 2021-02-22 16:07
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楼网友:人類模型
  • 2021-02-22 15:41
上面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); } }
  • 4楼网友:洎扰庸人
  • 2021-02-22 14:27
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.
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯