首页 新闻 会员 周边

关于继承父类,base调用父类的构造函数,但是。。。(广大好友一起来解决)

0
悬赏园豆:50 [已解决问题] 解决于 2011-12-22 13:24

代码我先附上:

问题:问题出在 初始化构造函数的时候,请大家F11调试的时候会注意到,Wage属性在调用方法的时候,按我们的理解是调用本身类(父类)的方法,但是他调用了子类的方法。

请问为什么?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _2011._12._21
{
public abstract class Employee//雇员抽象类
{
public string FirstName { get; private set; }
public string LastName { get; private set; }
public string Ssn { get; private set; }

public Employee(string first,string last,string ssn)
{
FirstName = first;
LastName = last;
Ssn = ssn;
}
public abstract decimal Earning(decimal salay);

public virtual int Time(int times)//抽象类可以写虚方法
{
return times;
}

public override string ToString()
{
return string.Format("FirstName:{0} LastName:{1} SSN:{2}",FirstName,LastName,Ssn);
}
}

public class SalariedEmployee : Employee//薪水雇员类
{
private decimal weeksalay;
public SalariedEmployee(string first, string last, string ssn, decimal salay):base(first,last,ssn)//调用抽象类的构造函数
{
Weeksalay = Earning(salay);
}

public decimal Weeksalay
{
get { return weeksalay; }
set
{
weeksalay = (value > 0) ? value : 0;
}
}

public override decimal Earning(decimal salay)
{
Weeksalay =salay * 7;
return Weeksalay;
}

public override string ToString()//如果不重写ToString方法那么继承的是抽象类的方法
{
return string.Format("FirstName:{0} LastName:{1} SSN:{2} Weeksalay:{3}", FirstName, LastName, Ssn, Weeksalay);
}
}

class HourEmployee:Employee//小时工类
{
private decimal wage;
private int hour;
public HourEmployee(string first,string last,string ssn,decimal hourwage,int hourtime):base(first,last,ssn)
{
Hour = hourtime;//注意这里,2个属性的前后顺序会决定了结果的

Wage = Earning(hourwage);//问题出在这里???????????



}
public decimal Wage
{
get { return wage; }
set
{
wage = (value > 0) ? value : 0;
}
}

public int Hour
{
get { return hour; }
set
{
hour = (value > 0) ? value : 0;
}
}

public override decimal Earning(decimal hourwage)
{
if (Hour <= 40)
{
Wage = hourwage * Hour;
}
else
{
Wage = Wage * 40 + (Hour - 40) * Wage * 1.5m;
}
return Wage;
}

public override string ToString()
{
return string.Format("{0} Hourwage:{1} Hourtimes:{2},Wage:{3}", base.ToString(), Wage,Hour,Wage);//这里继承抽象类的ToString方法
}
}

class BaseHe_Employee : HourEmployee//间接继承抽象类
{
private decimal rate;
private decimal salay;
public BaseHe_Employee(string first, string last, string ssn, decimal hourwage, int hourtime, decimal rate, decimal salay)
: base(first, last, ssn, hourwage, hourtime)
{
Rate = rate;
Salay = Earning(salay);
}

public decimal Rate
{
get { return rate; }
set { rate = (value > 0) ? value : 0; }
}

public decimal Salay
{
get { return salay; }
set { salay = (value > 0) ? value : 0; }
}

public override decimal Earning(decimal i)
{
return i + base.Earning(i);
}

public override string ToString()
{
return string.Format("{0} Rate:{1},Salay:{2}", base.ToString(),Rate,Salay);//这里继承抽象类的ToString方法
}
}





class Test
{
static void Main()
{

BaseHe_Employee oneBHE = new BaseHe_Employee("Mr.w", "Mery An", "10086", 6.50m, 24,15.5m, 16.5m);//第三个类
Console.WriteLine(oneBHE.Earning(16.5m));
Console.WriteLine(oneBHE.ToString());


}
}
}

 

经过3个人的讨论:

结论是:构造函数的合并 因为第三个类继承了第二个类的构造函数 等同于第二个构造函数是在第三个类里面调用的

 

大家一起来讨论下

QQ 246088063

Anleb的主页 Anleb | 菜鸟二级 | 园豆:208
提问于:2011-12-22 10:32
< >
分享
最佳答案
0

Earning是虚方法,被调用的时候会查找当前实例的类型的方法表像,因此调用的是BaseHe_Employee的Earning方法。不过这不是关键问题,真正的问题是你们不应该在构造函数里调用一个副作用这么大的虚方法,这才几个类就乱了,将来根本没法维护。比较清晰的做法是在构造函数里只设置一些基础数据(无副作用),包含业务逻辑的代码(比如获取Earning)则是一个只读的虚属性。

收获园豆:50
水牛刀刀 | 大侠五级 |园豆:6350 | 2011-12-22 13:23

已解了。。。谢谢大侠。。。

Anleb | 园豆:208 (菜鸟二级) | 2011-12-22 13:24
其他回答(1)
0

构造函数是先执行父类的,再执行子类的。

悟行 | 园豆:12559 (专家六级) | 2011-12-22 11:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册