When to Use Delegates Instead of Interfaces (C# Programming Guide)
2013-10-21 17:25
465 查看
Both delegates and interfaces enable a class designer to separate type declarations and implementation. A given
interface can be inherited and implemented by any
class or
struct. A
delegate can be created for a method on any class, as long as the method fits the method signature for the delegate. An interface reference or a delegate can be used by an object that has no knowledge of the class that implements the interface or delegate
method. Given these similarities, when should a class designer use a delegate and when should it use an interface?
Use a delegate in the following circumstances:
An eventing design pattern is used.
It is desirable to encapsulate a static method.
The caller has no need to access other properties, methods, or interfaces on the object implementing the method.
Easy composition is desired.
A class may need more than one implementation of the method.
Use an interface in the following circumstances:
There is a group of related methods that may be called.
A class only needs one implementation of the method.
The class using the interface will want to cast that interface to other interface or class types.
The method being implemented is linked to the type or identity of the class: for example, comparison methods.
One good example of using a single-method interface instead of a delegate is
IComparable or the generic version,
IComparable<T>.
IComparable declares the CompareTo method, which returns an integer that specifies a less than, equal to, or greater
than relationship between two objects of the same type. IComparable can be used as the basis of a sort algorithm. Although using a delegate comparison method as the basis of a sort algorithm would be valid, it is not ideal. Because the ability
to compare belongs to the class and the comparison algorithm does not change at run time, a single-method interface is ideal.
interface can be inherited and implemented by any
class or
struct. A
delegate can be created for a method on any class, as long as the method fits the method signature for the delegate. An interface reference or a delegate can be used by an object that has no knowledge of the class that implements the interface or delegate
method. Given these similarities, when should a class designer use a delegate and when should it use an interface?
Use a delegate in the following circumstances:
An eventing design pattern is used.
It is desirable to encapsulate a static method.
The caller has no need to access other properties, methods, or interfaces on the object implementing the method.
Easy composition is desired.
A class may need more than one implementation of the method.
Use an interface in the following circumstances:
There is a group of related methods that may be called.
A class only needs one implementation of the method.
The class using the interface will want to cast that interface to other interface or class types.
The method being implemented is linked to the type or identity of the class: for example, comparison methods.
One good example of using a single-method interface instead of a delegate is
IComparable or the generic version,
IComparable<T>.
IComparable declares the CompareTo method, which returns an integer that specifies a less than, equal to, or greater
than relationship between two objects of the same type. IComparable can be used as the basis of a sort algorithm. Although using a delegate comparison method as the basis of a sort algorithm would be valid, it is not ideal. Because the ability
to compare belongs to the class and the comparison algorithm does not change at run time, a single-method interface is ideal.
相关文章推荐
- When to Use Delegates Instead of Interfaces
- When to Use Delegates Instead of Interfaces
- When to Use Delegates Instead of Interfaces
- Knowing When to Use Override and New Keywords (C# Programming Guide)
- Know When to Use an Active Object Instead of a Mutex
- 干活来袭:Effective Concurrency: Know When to Use an Active Object Instead of a Mutex
- When to use Tomcat CATALINA_OPTS instead of JAVA_OPTS - See more at: http://www.tikalk.com/java/when
- When to Use Object-oriented Programming(Chapter 5 of Python 3 Object Oriented Programming)
- When to Use Bar Charts Instead of Pie Charts
- DEPRECATED: Use of this script to execute hdfs command is deprecated. Instead use the hdfs command
- c# Use Properties Instead of Accessible Data Members
- 【翻译】C# Tips & Tricks: Weak References - When and How to Use Them
- When to Use Static Classes in C#
- How to get a notification from Linux when the set of network interfaces changes
- How to Use Homebrew Zsh Instead of Mac OS X Default
- How to use Events in the Context of C#
- An effective way to use pattern to instead of multiple if else statements
- 导入android sdk samples工程报错"did you mean to use @+id instead of @+android:id?"
- Use Exception.ToString() instead of Exception.Message.
- A Guide to Blocks & Grand Central Dispatch (and the Cocoa API's making use of them)