第十三章 接口和抽象类
1.接口
接口体现的是扩展功能,本身不含数据和功能实现。
interface IUsb
{
//a: 接口中不含任何数据, 如字段。
void SetData(int data); //b: 声明方法不指定任何访问修饰符(public, private和protected都不行)。接口所有方法都隐式为公共方法。
int GetData(); //c: 接口中永远不含任何实现。
}
interface IBluetooth
{
void SetData(int data);
int GetData();
bool TestConnection();
}
// 类实现多个接口,为了区分,可在方法名称前加上接口名限定,这种方式称为显式实现接口。
class Mouse : IUsb, IBluetooth
{
private int storedData;
private bool connectionStatus;
void IUsb.SetData(int data)
{
this.storedData = data;
}
int IUsb.GetData()
{
return this.storedData;
}
public void SetData(int data)
{
this.storedData = data;
}
public int GetData()
{
return this.storedData;
}
public bool TestConnection()
{
int receivedData = 0;
SetData(this.storedData);
receivedData = GetData();
if (receivedData == this.storedData)
{
this.connectionStatus = true;
}
else
{
this.connectionStatus = false;
}
return this.connectionStatus;
}
}
public static void Main(string [] args)
{
Mouse mouse = new Mouse();
IUsb usb = mouse;
//mouse.SetData(12); // 编译时错误
usb.SetData(12);
Console.WriteLine($"storedData: {usb.GetData()}");
IBluetooth bluetooth = mouse;
mouse.SetData(24);
bluetooth.SetData(24);
bool connectionStatus = bluetooth.TestConnection();
Console.WriteLine($"storedData: {bluetooth.GetData()}, connectionStatus: {connectionStatus}");
// 输出:
// storedData: 12
// storedData: 24, connectionStatus: True
}
a, 显示实现接口,还有一个容易被忽略的变化,不能为方法指定访问修饰符。
b, void IUsb.SetData() 无访问修饰符,为私有。mouse对象无法访问,但却可以用恰当的接口引用Mouse对象。
2.抽象类
在继承中,将各个子类中通用的功能提取到一个单独的类中,这个类是通用功能的抽象,不是单独存在的实体。
interface IUsb
{
void SetData(int data);
int GetData();
}
interface IBluetooth
{
void SetData(int data);
int GetData();
bool TestConnection();
}
abstract class DataProcess
{
private int storedData;
private bool connectionStatus;
public void SetData(int data)
{
this.storedData = data;
}
public int GetData()
{
return this.storedData;
}
public bool TestConnection()
{
int receivedData = 0;
SetData(this.storedData);
receivedData = GetData();
if (receivedData == this.storedData)
{
this.connectionStatus = true;
}
else
{
this.connectionStatus = false;
}
return this.connectionStatus;
}
}
class Mouse : DataProcess, IUsb, IBluetooth
{
}
class Keyboard : DataProcess, IUsb, IBluetooth
{
}
public static void Main(string [] args)
{
Mouse mouse = new Mouse();
IBluetooth bluetooth = mouse;
mouse.SetData(24);
bluetooth.SetData(24);
bool connectionStatus = bluetooth.TestConnection();
Console.WriteLine($"storedData: {bluetooth.GetData()}, connectionStatus: {connectionStatus}");
Keyboard keyboard = new Keyboard();
IBluetooth bluetoothKeyboard = keyboard;
bluetoothKeyboard.SetData(48);
bool connectionStatusKeyboard = bluetoothKeyboard.TestConnection();
Console.WriteLine($"storedData: {bluetoothKeyboard.GetData()}, connectionStatus: {connectionStatusKeyboard}");
// 输出:
// storedData: 24, connectionStatus: True
// storedData: 48, connectionStatus: True
}
Keyboard, Mouse类中存在相同的功能实现GetData(), SetData(), TestConnection()等。为避免重复,将各个类中相同的方法实现放到专门的一个类中。相当于在各个类中提取出一个父类,因此在子类中可以删除大量重复性代码。

3.密封类
声明为密封的类为最终类,不可以被继承。密封类用sealed关键字修饰。
sealed class Lamp
{
public sealed override light() // 密封方法。只有用overide关键字声明的方法才能密封。
{
.....
}
}
// 修饰方法的几个关键字区别
// 1.virtual, 虚方法,方法的第一个实现。
// 2.override, 重写方法, 方法的另一个实现。
// 3.sealed override, 密封方法, 方法的最后一个实现。

浙公网安备 33010602011771号