继承(对象生命周期) + 覆盖[new](索引函数) + 重载[virtual/override]
继承(对象生命周期)
* 如下程序, 注意基类和派生类 构造方法 和 析构函数的 调用顺序
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApp
{
class lifecycle
{
public static void Main()
{
son sn = new son();
System.GC.Collect(); //垃圾收集, 调用析构函数
}
}
public class grandsire
{
public grandsire()
{
Console.WriteLine("调用grandsire构造函数");
}
~grandsire()
{
Console.WriteLine("调用grandsire析构函数");
}
}
public class father : grandsire
{
public father()
{
Console.WriteLine("调用father构造函数");
}
~father()
{
Console.WriteLine("调用father析构函数");
}
}
public class son : father
{
public son() //隐式调用基类构造函数 相当于public son():base(),但若基类构造函数带参数则派生类不能自动继承,必须显式调用
{ //eg: 基类构造函数:public contact(string name){...}, 则派生时public Family(string name):base(name){...}
Console.WriteLine("调用son构造函数");
System.GC.Collect();
}
~son()
{
Console.WriteLine("调用son析构函数");
}
}
}
结果:
调用grandsire构造函数
调用father构造函数
调用son构造函数
调用son析构函数
调用father析构函数
调用grandsire析构函数
//------------------------------------------------------------------------------------------
覆盖[new]
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApp
{
class InheritSample
{
public static void Main()
{
//继承
business c1 = new business();
c1.Name = "赵丽";
c1.title = "经理";
c1["办公电话"] = "010-1234567";
c1["传真"] = "888888";
c1.Output();
Console.WriteLine(" ");
Family c2 = new Family();
c2.Name = "王强";
c2.Relation = "表弟";
c2.Output();
Console.Read();
}
}
public class Contact
{
//protected 确保可以被派生类访问
protected string m_name;
protected string m_homePhone = "未知";
protected string m_busiPhone = "未知";
protected string m_mobilePhone = "未知";
public string Name
{
get { return m_name; }
set { m_name = value; }
}
public string this[string phoneType] //带参数分支的属性 索引函数
{
get
{
switch (phoneType)
{
case "住宅电话":
return m_homePhone;
case "办公电话":
return m_busiPhone;
case "手机":
return m_mobilePhone;
default:
return null;
}
}
set
{
switch (phoneType)
{
case "住宅电话":
m_homePhone = value;
break;
case "办公电话":
m_busiPhone = value;
break;
case "手机":
m_mobilePhone = value;
break;
default:
break;
}
}
}
public void Output()
{
Console.WriteLine("姓名:{0}", m_name);
Console.WriteLine("住宅电话:{0}", m_homePhone);
Console.WriteLine("办公电话:{0}", m_busiPhone);
Console.WriteLine("手机:{0}", m_mobilePhone);
}
}
public class business : Contact
{
protected string m_busiFax = "未知";
protected string m_title = "女士/先生";
public string title
{
get { return m_title; }
set { m_title = value; }
}
////1. new 覆盖基类方法
public new void Output()
{
Console.WriteLine("{0} {1}", m_name, m_title);
Console.WriteLine("办公电话:{0} 手机:{1}", m_busiPhone, m_mobilePhone);
Console.WriteLine("传真:{0}", m_busiFax);
}
//2. new 覆盖基类的索引函数
public new string this[string phoneType]
{
//get
//{
// switch (phoneType)
// {
// case "住宅电话":
// return m_homePhone;
// case "办公电话":
// return m_busiPhone;
// case "传真":
// return m_busiFax;
// case "手机":
// return m_mobilePhone;
// default:
// return null;
// }
//}
//set
//{
// switch (phoneType)
// {
// case "住宅电话":
// m_homePhone = value;
// break;
// case "办公电话":
// m_busiPhone = value;
// break;
// case "传真":
// m_busiFax = value;
// break;
// case "手机":
// m_mobilePhone = value;
// break;
// default:
// break;
// }
//}
//使用base访问基类成员 , 从而简化为↓
get
{
switch (phoneType)
{
case "传真":
return m_busiFax;
default:
return base[phoneType];
}
}
set
{
switch (phoneType)
{
case "传真":
m_busiFax = value;
break;
default:
base[phoneType] = value;
break;
}
}
}
}
public class Family : Contact
{
protected string m_relation;
protected DateTime m_birthday;
public string Relation
{
get { return m_relation; }
set { m_relation = value; }
}
public DateTime Birthday
{
get { return m_birthday; }
set { m_birthday = value; }
}
////1. new 覆盖基类方法
public new void Output()
{
Console.WriteLine("{0} {1}", m_name, m_relation);
Console.WriteLine("住宅电话:{0}", m_homePhone);
Console.WriteLine("办公电话:{0} 手机:{1}", m_busiPhone, m_mobilePhone);
}
}
}
结果:
赵丽 经理
办公电话:010-1234567 手机:未知
传真:888888
王强 表弟
住宅电话:未知
办公电话:未知 手机:未知
//------------------------------------------------------------------------------------------
重载[virtual/override]
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApp
{
class virtualInheritSample
{
public static void Main()
{
DerivedClass c = new DerivedClass();
c.Call();
Console.Read();
}
}
public class BaseClass
{
public void A()
{
Console.WriteLine("调用基类方法A");
}
public virtual void B()
{
Console.WriteLine("调用基类方法B");
}
}
public class DerivedClass : BaseClass
{
public new void A()
{
Console.WriteLine("调用派生类方法A");
}
public override void B()
{
Console.WriteLine("调用派生类方法B");
}
public void Call()
{
this.A();
this.B();
((BaseClass)this).A(); //强制转为基类对象
((BaseClass)this).B(); //调用基类虚函数 即调用其派生
}
}
}
结果:
调用派生类方法A
调用派生类方法B
调用基类方法A
调用派生类方法B
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApp
{
class ATM_overrideSample
{
public static void Main()
{
BankCard[] cards = new BankCard[3];
cards[0] = new BankCard();
cards[1] = new ForeignBankCard();
cards[2] = new LimitBankCard();
foreach (BankCard card in cards)
{
card.Deposit(5000);
card.Withdraw(2000);
}
Console.Read();
}
}
public class BankCard
{
protected decimal m_amount;
public virtual void Deposit(decimal x)
{
m_amount += x;
Console.WriteLine("--------------------------------");
Console.WriteLine("存款{0}元,余额{1}元", x, m_amount);
}
public virtual void Withdraw(decimal x)
{
if(m_amount>x)
{
m_amount -= x;
Console.WriteLine("取款{0}元,余额{1}元",x,m_amount);
}
else
{
Console.WriteLine("余额不足");
}
}
}
public class ForeignBankCard : BankCard
{
public override void Withdraw(decimal x)
{
decimal fee = x * 0.01M;
if (m_amount > x + fee)
{
m_amount -= (x + fee);
Console.WriteLine("取款{0}元,手续费{1}元,余额{2}元", x, fee, m_amount);
}
else
{
Console.WriteLine("余额不足");
}
}
}
public class LimitBankCard : BankCard
{
public override void Withdraw(decimal x)
{
if (x >= 1000)
{
Console.WriteLine("对不起,此卡限制1000元以上取款");
}
else
{
base.Withdraw(x);
}
}
}
}
结果:
--------------------------------
存款5000元,余额5000元
取款2000元,余额3000元
--------------------------------
存款5000元,余额5000元
取款2000元,手续费20.00元,余额2980.00元
--------------------------------
存款5000元,余额5000元
对不起,此卡限制1000元以上取款
浙公网安备 33010602011771号