WEB开发网
开发学院软件开发C语言 Effective C# 原则19:选择定义和实现接口而不是继... 阅读

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

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()方法时不必对左边的对象进行拆箱。

基类可以用来描述和实现一些具体的相关类型的行为。接口则是描述一些原子级别的功能块,不相关的具体类型都可以实现它。接口以功能块的方法来描述这些对象的行为。如果你明白它们的不同之处,你就可以创建出表达力更强的设计,并且它们面对修改是有很加强的伸缩性的。类的继承可以用来定义一些相关类型。通过实现一些接口来暴露部份功能来访问这些类型。

上一页  1 2 3 4 5 

Tags:Effective 原则 选择

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接