Effective C# 原则19:选择定义和实现接口而不是继承
2009-02-19 08:16:41 来源:WEB开发网public class Employee
{
public string Name
{
get
{
return string.Format( "{0}, {1}", _last, _first );
}
}
// other details elided.
}
public class Customer
{
public string Name
{
get
{
return _customerName;
}
}
// other details elided
}
public class Vendor
{
public string Name
{
get
{
return _vendorName;
}
}
}
Eyployee,Customer和Vendor类不应该共享一个基类。但它们共享一些属性:姓名(正如前面显示的那样),地址,以及联系电话。你应该在一个接口中创建这些属性:
public interface IContactInfo
{
string Name { get; }
PhoneNumber PrimaryContact { get; }
PhoneNumber Fax { get; }
Address PrimaryAddress { get; }
}
public class Employee : IContactInfo
{
// implementation deleted.
}
对于不的类型使用一些通用的功能,接口可以简化你的编程任务。Customer, Employee, 和Vendor使用一些相同的功能,但这只是因为你把它们放在了接口上。
使用接口同样意味着在一些意外情况下,你可以减少结构类型拆箱的损失。当你把一个结构放到一个箱中时,这个箱可以实现结构上的所有接口。当你用接口指针来访问这个结构时,你不用结构进行拆箱就可以直接访问它。这有一个例子,假设这个结构定义了一个链接和一些说明:
public struct URLInfo : IComparable
{
private string URL;
private string description;
public int CompareTo( object o )
{
if (o is URLInfo)
{
URLInfo other = ( URLInfo ) o;
return CompareTo( other );
}
else
throw new ArgumentException(
"Compared object is not URLInfo" );
}
public int CompareTo( URLInfo other )
{
return URL.CompareTo( other.URL );
}
}
你可以为URLInfo的对象创建一个有序表,因为URLInfo实现了IComparable接口。URLInfo结构会在添加到链表中时被装箱,但Sort()方法不须要拆箱就可以调用对象的CompareTo()方法。你还须要对参数(other)进行拆箱,但你在调用IComparable.CompareTo()方法时不必对左边的对象进行拆箱。
基类可以用来描述和实现一些具体的相关类型的行为。接口则是描述一些原子级别的功能块,不相关的具体类型都可以实现它。接口以功能块的方法来描述这些对象的行为。如果你明白它们的不同之处,你就可以创建出表达力更强的设计,并且它们面对修改是有很加强的伸缩性的。类的继承可以用来定义一些相关类型。通过实现一些接口来暴露部份功能来访问这些类型。
- ››选择好的广告联盟:选择广告联盟理解掌握的六大绝招...
- ››选择谁? 揭秘90后必备的音乐播放器
- ››选择性关闭Win 7视频预览 节约系统资源
- ››选择适合的SRAM存储器的技巧
- ››Effective C# 原则40:根据需求选择集合
- ››Effective C# 原则41:选择DataSet而不是自定义的...
- ››Effective C# 原则42:使用特性进行简单的反射
- ››Effective C# 原则43:请勿滥用反射
- ››Effective C# 原则44:创建应用程序特定的异常类
- ››Effective C# 第6章:杂项
- ››Effective C# 原则45:选择强异常来保护程序
- ››Effective C# 原则47:选择安全的代码
更多精彩
赞助商链接