继承的类型:
实现继承:表示一个类型派生于一个基类型,拥有该基类型的所有成员字段和函数。可以在派生类型的定义中重写该函数的实现代码。在需要给现有的类型添加功能,或许多相关的类型共享一组重要的公共功能时,这种类型的继承是非常有效的。
接口继承:表示一个类型只继承了函数的签名,没有继承任何实现代码。接口继承常常被看做提供了一种契约:让类型派生于接口,来保证为客户提供某个功能。例如,某些类型可以指定从接口System.IDisposable中派生,从而提供一种清理资源的方法Dispose()。
实现继承的声明:
属性 类修饰符 class 派生类名:基类名 {类体}
base关键字:用于从派生类中访问基类成员,它有两种基本用法:
<1>在定义派生类的构造函数中,指明要调用的基类构造函数,
public Employee(string Name1, int Age, string D, decimal S)
: base(Name1, Age)
<2>用基类中被派生类覆盖的方法。base.Display();
覆盖基类成员:用new关键字public new void Display()
类的多态性:
<1>编译时的多态性:通过方法重载来实现的。
<2>运行时的多态性通过虚方法实现:在类的方法声明前加上了virtual修饰符,无论基类还是派生类,都调用同一个显示方法,根据对象不同,自动显示不同的信息。可以用虚方法来实现。
派生类对象也是其基类的对象,但基类对象却不是其派生类的对象。Person aPerson=
class Person
{
private String name = "张三";//类的数据成员声明
private int age = 12;
public void Display()//类的方法(函数)声明,显示姓名和年龄
{
Console.WriteLine("姓名:{0},年龄:{1}", name, age);
}
protected virtual void Display1()//类的虚方法
{
Console.WriteLine("姓名:{0},年龄:{1}", name, age);
}
static public void DisplayData(Person aPerson)//静态方法
{
aPerson.Display1();//不是静态方法调用实例方法,如写为Display()错误
}
public Person(string Name, int Age)//构造函数,函数名和类同名,无返回值
{
name = Name;
age = Age;
}
public Person()//类的构造函数重载
{
name = "田七";
age = 12;
}
}
class Employee : Person//Person类是基类
{
private string department;//部门,新增数据成员
private decimal salary;//薪金,新增数据成员
public Employee(string Name1, int Age, string D, decimal S)
: base(Name1, Age)
{//注意base的第一种用法,根据参数调用指定基类构造函数,注意参数的传递
department = D;
salary = S;
}
public new void Display()//覆盖基类Display()方法,注意new,不可用override
{
base.Display();//访问基类被覆盖的方法,base的第二种用法
Console.WriteLine("部门:{0} 薪金:{1}", department, salary);
}
protected override void Display1()//重载虚方法,注意用override
{
base.Display();//访问基类同名方法
Console.WriteLine("部门:{0} 薪金:{1} ", department, salary);
}
}
class Class1
{
static void
{
Person OnePerson = new Person("张三", 30);//生成类的对象
Employee OneEmployee = new Employee("李四", 30, "计算机系", 2000);
Person TwoEmployee = new Employee("王五", 30, "财务", 2000);
OnePerson.Display();
OneEmployee.Display();
TwoEmployee.Display();
Person.DisplayData(OnePerson);//使用了virtual后只用一个方法即可
Person.DisplayData(OneEmployee); //显示派生类数据
Person.DisplayData(TwoEmployee);
}
}
接口声明:
public interface IExample
{//所有接口成员都不能包括实现
string this[int index] {get;set;}//索引指示器声明
event EventHandler E;//事件声明
void F(int value);//方法声明
string P { get; set;}//属性声明
}
声明接口时,需注意以下内容:
l 接口成员只能是方法、属性、索引指示器和事件,不能是常量、域、操作符、构造函数或析构函数,不能包含任何静态成员。
l 接口成员声明不能包含任何修饰符,接口成员默认访问方式是public。
接口继承:
把引用变量声明为IBankAccount引用的方式。这表示它们可以指向实现这个接口的任何类的实例。但我们只能通过这些引用调用接口的方法-- 如果要调用由类执行的、不在接口中的方法,就需要把引用强制转换为合适的类型。
public interface IBankAccount
{
void PayIn(decimal amount);
bool Withdraw(decimal amount);
decimal Balance
{
get;
}
}
public class SaverAccount : IBankAccount
{
private decimal balance;
public void PayIn(decimal amount)
{
balance += amount;
}
public bool Withdraw(decimal amount)
{
if (balance >= amount)
{
balance -= amount;
return true;
}
Console.WriteLine("Withdrawal attempt failed.");
return false;
}
public decimal Balance
{
get
{
return balance;
}
}
public override string ToString()
{
return String.Format("Venus Bank Saver: Balance = {0,6:C}", balance);
}
}
static void
{
IBankAccount venusAccount = new SaverAccount();
venusAccount.PayIn(200);
venusAccount.Withdraw(100);
Console.WriteLine(venusAccount.ToString());
}

浙公网安备 33010602011771号