zoukankan      html  css  js  c++  java
  • Ruby快速入门(四):类和模块

    原文地址:http://blog.csdn.net/zhu_xz/article/details/4936800

    我在第一篇文章 里简单的提过类和对象,但说得太过简单,所以这里重新再说一遍,也加上了对模块的简单介绍。再重申一遍,在Ruby中,一切都是对象,即便是简单的如1、2、3、4这样的数字都是对象。

     

    下面的代码向我们展示了如何使用类和对象 

    1. # 定义类  
    2. class BaseClass  
    3.   # 定义accessor  
    4.   attr_accessor:name  
    5.   # 构造函数  
    6.   def initialize(name)  
    7.     puts "BaseClass::initialize - #{name}"  
    8.     @name = name  
    9.   end  
    10.   # 自定义函数  
    11.   def printName  
    12.     puts @name  
    13.   end  
    14. end  
    15. # Ruby只支持单继承  
    16. class SubClass < BaseClass  
    17.   def initialize(name)  
    18.     # 调用父类构造函数  
    19.     super(name)  
    20.     puts "SubClass::initialize - #{name}"  
    21.   end  
    22. end  
    23. # 创建对象  
    24. obj = SubClass.new("obj")  
    25. # 调用对象方法  
    26. puts obj.name  
    27. obj.name = "name changed"  
    28. obj.printName  

     

    则结果为:

    BaseClass::initialize - obj
    SubClass::initialize - obj
    obj
    name changed

     

    Ruby提供了public、protected和private来修饰类成员,其含义与C++相同。但不同的是,在Ruby中,所有类变量都默认 是private的,而类函数都默认是public的。对类成员而言,也可像第4行那样用attr_accessor对其进行修饰,使其可被外部访问。

     

    和C++或Java相比,Ruby中的类具有更大的灵活性,随时随地都可以对类的内容进行修改。

    1. class Original  
    2.   def fun  
    3.     puts "original::fun"  
    4.   end  
    5. end  
    6. obj = Original.new  
    7. obj.fun  
    8. class Original  
    9.   def fun2  
    10.     puts "original::fun2"  
    11.   end  
    12. end  
    13. obj.fun2  

     

    另一方面,为了降低程序的复杂度,Ruby只支持单继承,每个类只能有一个父类。但同时为了提高程序的灵活性,Ruby通过模块 为多重继承提供了可能。

     

    Ruby中的模块从某种角度说类似于C++中的namespace,例如:

    1. module Mod  
    2.   def myFunction  
    3.     puts "myFunction"  
    4.   end  
    5.   module_function :myFunction  
    6.   class Class  
    7.     def yourFunction  
    8.       puts "Mod::Class.yourFunction"  
    9.     end  
    10.   end  
    11. end  
    12. Mod.myFunction  
    13. object = Mod::Class.new  
    14. object.yourFunction  

     

    这段代码定义了一个名为Mod的模块,其中包含一个名为myFunction的函数和一个名为Class的类。然后直接调用函数 myFunction(注意需要声明为module_function),并创建了一个名为object的Mod::Class对象及调用其函数。

     

    通过模块,也能够“实现”多重继承。或者更加准确的说,模块中的类和函数都被mixed-in到了新的类中,所以在Ruby中这又被成为mixin。

    1. module Mod1  
    2.   def fun1  
    3.     puts "Mod1::fun1"  
    4.   end  
    5.   instance_method :fun1  
    6. end  
    7. module Mod2  
    8.   def fun2  
    9.     puts "Mod2::fun2"  
    10.   end  
    11.   instance_method :fun2  
    12. end  
    13. class Cls  
    14.   include Mod1  
    15.   include Mod2  
    16. end  
    17. obj = Cls.new  
    18. obj.fun1  
    19. obj.fun2  

  • 相关阅读:
    WPF中回车后跳转至指定控件上
    WPF 中Devexpress GridControl无限高度问题
    WPF中使用DevExpress控件lookupedite
    [.Net 5.0] 10. WebApi 自托管(WinFrom、Wpf)
    [C#] 尝鲜.net6.0的C#代码热重载
    [WPF 学习] 18. 摄像头(肢解DirectShow)
    [WPF 学习] 17.WPF摄像头
    [WPF 学习] 16.WPF Bitmap to ImageSource的几种方式
    [opencv]吊诡的摄像头黑屏
    WPF 基于五点线性平滑曲线算法
  • 原文地址:https://www.cnblogs.com/wangkangluo1/p/2115538.html
Copyright © 2011-2022 走看看