永发信息网

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

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

其他2点,你是学java的,应该不解释了.
---------
ps:如果你上面3点是从书上找的,那这书真是误人子弟.
全部回答
调用父类已经被子类覆盖的方法
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访问修饰符的属性或方法都可以访问。 加了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); } }
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.
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
初中物理苏教版苏科版参考资料哪个比较好
从深圳龙华到龙岗区坪山镇坐什么公交车
超市能充话费吗
DNF第四季怎么才能刷到SS或者粉啊? 我打了好
人生在平淡中寻找幸福,在细微中品味幸福,在
邮递员送信送到哪儿。
我一直觉得韩国是劣等种族,这个国家的存在都
鲫鱼加冰糖加花椒熬汤治什么的
电脑用什么看美剧
[生物——选修3现代生物科技专题](15分)胚胎
锤石大招现在还有伤害吗?在4.13版中
三星i9100hd 怎么改网络模式
下列无机结合料基层养生的说法中,正确的有()
在所不辞是什么意思
永祥和快餐店这个地址在什么地方,我要处理点
推荐资讯
去找工作,面试完却要培训,而且不一定用你
八仙人家茶楼地址在什么地方,想过去办事,
请问大家我的无线网子网掩码正确255.255.255.
优哈优哈在哪里啊,我有事要去这个地方
互帮互助的反义词
刷机精灵刷机显示rom格式不正确,怎么办
小孩子不听话我狠狠的扇了一巴掌脸上都红了
《命运石之门》可以一次性打出所有结局吗?
厦门在河南项城的哪个方向
西铁设备公司石化有限公司地址在什么地方,想
关于行政诉讼的说法,正确的是( )。A.行政
连接上wifi,但是就是没有弹出登陆账号的ye m
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?