Effective C# 学习笔记(二十二)多用接口定义实现,少用继承
2011-07-13 16:08
232 查看
首先从宏观上区分接口和类型
接口定义了行为
类型定义特性及继承结构,即是实体间的关系
接口和抽象类的区分
接口和抽象类都可定义行为而不实现 ,但抽象类可以
接口可以被多继承(实现),抽象类只可被继承一个
技巧
利用扩展方法来为接口添加统一实现方法。
例如.net framework 中的System.Linq.Enumerable<T>为IEnumerable<T>接口实现了30多个扩展方法,示例代码如下:
public static class Extensions
{
public static void ForAll<T>(
this IEnumerable<T> sequence,
Action<T> action)
{
foreach (T item in sequence)
action(item);
}
}
// usage
foo.ForAll((n) => Console.WriteLine(n.ToString()));
利用接口作为参数和返回值的类型
例如:
public static void PrintCollection<T>(IEnumerable<T> collection)
{
foreach (T o in collection)
Console.WriteLine("Collection contains {0}",o.ToString());
}
对类的消费者只暴露部分类实现的接口,可以保证你的类得到最大限度的保护
利用接口,扩展struct类型的行为,例如可以让结构体实现IComparable和Icomparable<T>接口,来为SortedList<T>类型的结构体集合提供比较大小的行为特性
代码如下:
public struct URLInfo : IComparable<URLInfo>, IComparable
{
private string URL;
private string description;
#region IComparable<URLInfo> Members
public int CompareTo(URLInfo other)
{
return URL.CompareTo(other.URL);
}
#endregion
#region IComparable Members
int IComparable.CompareTo(object obj)
{
if (obj is URLInfo)
{
URLInfo other = (URLInfo)obj;
return CompareTo(other);
}
else
throw new ArgumentException(
"Compared object is not URLInfo");
}
#endregion
}
接口定义了行为
类型定义特性及继承结构,即是实体间的关系
接口和抽象类的区分
接口和抽象类都可定义行为而不实现 ,但抽象类可以
接口可以被多继承(实现),抽象类只可被继承一个
技巧
利用扩展方法来为接口添加统一实现方法。
例如.net framework 中的System.Linq.Enumerable<T>为IEnumerable<T>接口实现了30多个扩展方法,示例代码如下:
public static class Extensions
{
public static void ForAll<T>(
this IEnumerable<T> sequence,
Action<T> action)
{
foreach (T item in sequence)
action(item);
}
}
// usage
foo.ForAll((n) => Console.WriteLine(n.ToString()));
利用接口作为参数和返回值的类型
例如:
public static void PrintCollection<T>(IEnumerable<T> collection)
{
foreach (T o in collection)
Console.WriteLine("Collection contains {0}",o.ToString());
}
对类的消费者只暴露部分类实现的接口,可以保证你的类得到最大限度的保护
利用接口,扩展struct类型的行为,例如可以让结构体实现IComparable和Icomparable<T>接口,来为SortedList<T>类型的结构体集合提供比较大小的行为特性
代码如下:
public struct URLInfo : IComparable<URLInfo>, IComparable
{
private string URL;
private string description;
#region IComparable<URLInfo> Members
public int CompareTo(URLInfo other)
{
return URL.CompareTo(other.URL);
}
#endregion
#region IComparable Members
int IComparable.CompareTo(object obj)
{
if (obj is URLInfo)
{
URLInfo other = (URLInfo)obj;
return CompareTo(other);
}
else
throw new ArgumentException(
"Compared object is not URLInfo");
}
#endregion
}
相关文章推荐
- effective C++笔记之条款36、37: 区分接口继承和实现继承、绝不要重新定义继承而来的非虚函数
- PHP以接口方式实现多重继承(完全模拟)--学习笔记
- 《Effective C#》读书笔记——条目22:通过定义并实现接口替代继承<使用C#表达设计>
- 14. JAVA 枚举(Enum、类集EnumMap&EnumSet 、实现接口、定义抽象方法) ----- 学习笔记
- Effective C# 原则19:选择定义和实现接口而不是继承(译)
- Effective C# Item19:定义并实现接口优于继承类型
- Effective C# 学习笔记(四十一)使利用DynamicObject或IDynamicMetaObjectProvider接口实现数据驱动的动态类型
- EJB3.0学习笔记---Bean实现多个接口的情况下定义,访问方式:
- Effective C#学习笔记:显式实现接口
- Objective-C 学习笔记之基本语法(1/2): 类的定义、继承、多态与接口等
- Effective C# 学习笔记(三十一)利用IComparable<T>和IComparer<T>接口来实现排序关系
- 《C#入门经典》第六版 学习笔记之第十章 定义类成员(1) 10.3 接口的实现~10.5 部分类方法定义
- Java 学习笔记 (3) -抽象类 abstract 接口 interface 内部类 inner class 继承 extends 实现 implements 包 package
- Effective C# 原则19:选择定义和实现接口,而不是继承
- java-面向对象之继承(感言:经过第一天和Java中类的继承和接口的实现的接触,自己需要学习的还很多,还要从基础抓起,尽管有点迷糊,但学到很多很喜欢这种时光!加油!)下面是查到的相关资料以备查看。
- Android 组件学习笔记(activity跳转,接口实现的点击事件)
- JavaScript学习笔记二十二:class继承
- java 学习笔记 继承与接口(二)
- java 学习 私有类实现接口 ,一个类继承来的方法和接口实现方法重复第八天
- Thinking in Java学习笔记 Thread.UncaughtExceptionHandler接口实现捕获线程内异常