using System;class Employee
{
public Employee(string name)
{
this.Name = name;
} protected string Name; public string name
{
get
{
return this.Name;
}
} public void calculatPay()
{
Console.WriteLine("Employee.calculatPay call for {0}",name);
}}class ContractEmployee : Employee
{
public ContractEmployee(string name)
: base(name)
{ }
public new void calculatPay() // 请问下,这个name的值是通过什么得到的?希望各位解释下:我能理解的地方:1,ContractEmployee构造函数中的
// name 指示的是下面输出行参数里的name.
{ //name 就是自动传递给Employee中的构造函数。 2,基类会把name的值赋值给基类中的name属性。
Console.WriteLine("ContractEmployee.calculatPay call for {0}", name); //3,继承类中是否会包含基类中的所有成员(这个例子)?
}}class SalariedEmployee : Employee
{
public SalariedEmployee(string name)
: base(name)
{ }
public new void calculatPay()
{
Console.WriteLine("SalariedEmployee.caculatPay call for {0}",name);
}
}class poly2App
{
protected Employee[] employees; public void LoadEmployees()
{
employees = new Employee[2];
employees[0] = new ContractEmployee("Kate Green");
employees[1] = new SalariedEmployee("Tom");
} public void Dopayroll()
{
foreach (Employee emp in employees)
{
emp.calculatPay();
}
} public static void Main()
{
poly2App poly2 = new poly2App();
poly2.LoadEmployees();
poly2.Dopayroll();
}
}
解决方案 »
- winForm 不使用的事件处理函数体 自动清空?
- c# 使用vs2010无法编译.net2.0的项目
- 怎样按概率产生随机数?
- 控件的location是相对什么的坐标?
- 小山大侠关于你的压缩程序的问题!!
- 哪个有技术的想干自己的事业!
- 违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条
- 现在做个系统,两个搭档说数据库操作都用存储过程,以前没这么做过,大家能不能解释一下
- 同一个panel里的两个PictureBox控件不能同时更新图像???
- 访问一个局域网共享文件问题
- GridView删除确认问题,OnClientClick="return confirm('确认要删除此行信息吗?')" ,点取消时候根本不行啊!![顶者有分]
- 如何实现gridView的datasource累加功能?
=====================================================
name就是基类Employee中的属性
任何情况下 子类 都是继承了 父类 的所有成员变量。
但是遇到 私有 字段的时候 子类 不能调用。也就是所并不是所有的 父类 成员变量子类都能用,但是却都是被继承下来了的。你这个列子问题:
1.一个只读属性在构造函数中给属性赋值?????
public string name
{
get
{
return this.Name;
}
}
2.通常情况下我们都是把字段 作为 小写,属性首字母大写。你咋是反起的呢。我都看昏了。
{ }
这句话其实就是将name变量传递给基类的构造函数的参数,而这里的name变量是由外界传入的参数,也就是当你运行new ContractEmployee("Kate Green")中的"Kate Green"在基类中有name属性和Name变量,当执行了构造函数后,Name变量中就有了值,然后通过
Console.WriteLine("SalariedEmployee.caculatPay call for {0}",name);这句话则将name这个属性的值给取了出来
|
base("张三")
|
Employee("张三")
|
this.Name ="张三"
|
protected string Name="张三"Console.WriteLine("ContractEmployee.calculatPay call for {0}", name)
||
public string name
{
get
{
return this.Name;
}
}
||
protected string Name="张三"
public ContractEmployee(string name) : base(name)
{ }
这样写表名子类的构造函数调用的是基类的,你前面说“ContractEmployee构造函数中的name 指示的是下面输出行参数里的name.”
我觉得不对。输出行里的“name”,应该是属性name,而不是外界传进来的参数(当然,构造函数需要引入外来参数)。
你可能是对“:base(name)”这个用法有误解,那只是调用基类的构造函数来构造子类,并没有对基类有什么操作。
2、Console.WriteLine("ContractEmployee.calculatPay call for {0}", name);这个name调用的并不是构造函数里的,而是从父类中继承下来的
public string name{get{return this.Name;}}的属性
3、子类继承父类,子类它并不能继承父类的所有成员,例如说父类中有一个私有成员,则子类是不会把父类的私有成员继承下来的
你所举的例子并不是方法重载的例子,你还得多看看 方法重载、方法重写、方法覆盖之间的区别