Mixin

维基百科,自由的百科全书
跳到导航 跳到搜索

Mixin面向对象程序设计语言中的,提供了方法的实现。其他类可以访问mixin类的方法而不必成为其子类。[1]Mixin有时被称作"included"而不是"inherited"。mixin为使用它的class提供额外的功能,但自身却不单独使用(不能单独生成实例对象,属于抽象类)。因为有以上限制,Mixin类通常作为功能模块使用,在需要该功能时“混入”,而且不会使类的关系变得复杂。使用者与Mixin不是“is-a”的关系,而是「-able」关系

Mixin有利于代码复用[2]又避免了多继承的复杂。[3][4]使用Mixin享有单一继承的单纯性和多重继承的共有性。接口与mixin相同的地方是都可以多继承,不同的地方在于 mixin 是带实现的。Mixin也可以看作是带实现的interface英语Interface (object-oriented programming)。这种设计模式实现了依赖反转原则[5]

实现[编辑]

编程语言支持[编辑]

除了Flavors与CLOS (作为Common Lisp的部分),其他语言的支持:

一些语言允许运行时从一个对象拷贝方法到另一个对象。这可以“借”mixin的方法。

C#Visual Basic.NET支持接口的扩展方法(extension method)。

例子[编辑]

Common Lisp[编辑]

Python[编辑]

Python中,除了使用protocol以外,也可以用多继承的形式来实现Mixin。为了区分普通的多继承,mixin类的类名一般都会带上后缀:“Mixin”,比如Python 2中的类UserDict.DictMixinDictMixin类包括部分实现,使用者的类只要实现几个必须的函数接口,如:__getitem__(), __setitem__(), __delitem__(), keys()[10]

Python的SocketServer模块[11]提供了UDPServer类与TCPServer类,作为UDPTCPsocket服务器。有两个mixin类:ForkingMixInThreadingMixIn。通过如以下代码的方式使用ThreadingMixIn扩展TCPServer

class ThreadingTCPServer(ThreadingMixIn, TCPServer):
  pass

ThreadingMixIn类为TCP服务器添加了新功能,使每个新连接都会创建出新线程。而如果是ForkingMixIn,则会使每个新连接fork出新的进程。

Ruby[编辑]

在ruby中,并不直接使用Mixin这个单词,而是使用在类的声明中include一个module的办法。

JavaScript[编辑]

其他语言[编辑]

接口与trait[编辑]

参见[编辑]

参考文献[编辑]

  1. ^ http://c2.com/cgi/wiki?MixIn
  2. ^ http://naildrivin5.com/blog/2012/12/19/re-use-in-oo-inheritance.html
  3. ^ http://culttt.com/2015/07/08/working-with-mixins-in-ruby/
  4. ^ Boyland, John; Giuseppe Castagna. Type-Safe Compilation of Covariant Specialization: A Practical Case. (编) Pierre Cointe. ECOOP '96, Object-oriented Programming: 10th European Conference. Springer. 26 June 1996: 16–17 [17 January 2014]. ISBN 9783540614395. 
  5. ^ 存档副本. [2017-11-22]. (原始内容存档于2015-09-25). 
  6. ^ OOPSLA '90, Mixin based inheritance (pdf)
  7. ^ slava. Factor/Features/The language. concatenative.org. 2010-01-25 [2012-05-15]. Factor's main language features: … Object system with Inheritance, Generic functions, Predicate dispatch and Mixins  外部链接存在于|publisher= (帮助)
  8. ^ Mixin Class Composition. École polytechnique fédérale de Lausanne. [16 May 2014]. 
  9. ^ Mixin classes in XOTcl
  10. ^ 3.7 UserDict -- Class wrapper for dictionary objects. 
  11. ^ Source code for SocketServer in CPython 3.5
  12. ^ http://raganwald.com/2014/04/10/mixins-forwarding-delegation.html
  13. ^ http://bob.yexley.net/dry-javascript-with-mixins/
  14. ^ https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html
  15. ^ Implementing Mix-ins with C# Extension Methods
  16. ^ I know the answer (it's 42) : Mix-ins and C#
  17. ^ Mixins, generics and extension methods in C#
  18. ^ The many talents of JavaScript for generalizing Role Oriented Programming approaches like Traits and Mixins, April 11, 2014.
  19. ^ Angus Croll, A fresh look at JavaScript Mixins, published May 31, 2011.
  20. ^ JavaScript Code Reuse Patterns, April 19, 2013.
  21. ^ https://gleichmann.wordpress.com/2009/07/19/scala-in-practice-traits-as-mixins-motivation

外部链接[编辑]