您的位置:首页 > 编程语言 > C#

《CLR via C#》读书笔记 之 接口

2013-02-27 11:14 302 查看

第十三章 接口

2013-02-27

13.5 隐式和显示接口方法实现
1. 隐式接口的实现
2. 显示接口的实现
13.8 实现多个具有相同方法名和签名的接口
13.9 用显示接口类型方法实现来增强编译时类型安全

ToDo: 什么时候使用接口和什么时候使用类

13.5 隐式和显示接口方法实现

返回

?显式接口和隐式接口的关系

1.隐式接口的实现

class SimpleType : IDisposable
{
public void Dispose() { Console.WriteLine("Dispose"); }
}

class Program
{
static void Main(string[] args)
{
SimpleType st = new SimpleType();
//调用公共Dispose方法
st.Dispose();
//调用IDisposable的Dispose方法
IDisposable d = st;
d.Dispose();
}
}


上面调用的是同一个方法,输出都是:Dispose

2. 显示接口的实现

class SimpleType : IDisposable
{
public void Dispose() { Console.WriteLine("public Dispose"); }
//显式调用
void IDisposable.Dispose() { Console.WriteLine("IDisposable.Dispose"); }
}


输出结果:

public Dispose

IDisposable.Dispose

注意:在C#定义一个显示接口方法是,不允许定义可访问性,编译器会设置其访问性为private。要调用它,只能通过接口类型的一个变量来进行。

13.8 实现多个具有相同方法名和签名的接口

返回

有两个接口具有相同方法名和签名的方法,必须用“显示接口的方法实现”。

interface IWindow { object GetMenu();}
interface IRestaurant { object GetMenu();}
class Mario : IWindow, IRestaurant
{
object IWindow.GetMenu() { return null; }
object IRestaurant.GetMenu() { return null; }
}


13.9 用显示接口类型方法实现来增强编译时类型安全

返回

如何接口的方法接受System.Object类型的参数或返回值时,就会丧失编译时的类型安全性,装箱也会发生,看如下代码:

struct SomeValueType : IComparable
{
private int _x;
public SomeValueType(int x) { _x = x; }
public int CompareTo(Object other)
{ return (_x - ((SomeValueType)other)._x); }
}

class Program
{
static void Main(string[] args)
{
SomeValueType v = new SomeValueType(0);
object o = new object();
int n = v.CompareTo(v); //非预期装箱
n = v.CompareTo(o);   //InvalidCastException异常
}
}


可做如下改动避免以上错误:

struct SomeValueType : IComparable
{
private int _x;
public SomeValueType(int x) { _x = x; }
public int CompareTo(SomeValueType other) //修改参数类型
{ return (_x - other._x); }
int IComparable.CompareTo(Object other) //添加显示接口方法实现
{ return CompareTo((SomeValueType)other); }
}

class Program
{
static void Main(string[] args)
{
SomeValueType v = new SomeValueType(0);
object o = new object();
int n = v.CompareTo(v); //没有装箱操作
n = v.CompareTo(o);   //编译时就会报错
}
}


但如果定义一个接口类型变量还是会报错,看如下代码:

class Program
{
static void Main(string[] args)
{
SomeValueType v = new SomeValueType(0);
IComparable c = v;   //装箱
object o = new object();
int n = c.CompareTo(v); //非预期装箱
n = c.CompareTo(o);    // InvalidCastException异常
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: