2013-04-26 73 views
0

我想了解以下在Ruby中扩展类的最佳实践是什么?

module XYZ 
    class A 
    end 
    class B 
    end 
end 

不C类同时继承类A和B之间的差异,或者我必须使用<延长呢?

module YZZ 
include XYZ 
    class C < A 
    end 
end 

当我做下列事情时会发生什么?它现在包括所有课程,还是仅包含A课程?

module YZZ 
extend XYZ 
    class C < A 
    end 
end 
  • 什么是从扩展C类的最佳方式?
  • 如何使用A和B来扩展C类?
  • 我怎样才能只包括类A?
+1

你在第二个和第三个代码块中有什么是无效的Ruby。 – 2013-04-26 12:05:22

+0

什么是无效的? – amjad 2013-04-26 12:24:08

+1

您缺少模块名称。像'module Hello;延长XYZ结束“。 – 2013-04-26 12:32:13

回答

0

广告1,是的,C继承了A和B,当你使用#include。 #extend适用于类方法。

广告2. class C < A,想一想,A只是一个常数,它被赋值为实例Class的对象 。所以,当然,C成为它的子类。

Ad 3.当您在'module'语句中使用#extend时,self是模块本身,而XYZ 基本上包含在它的sigleton类中。

至于你最后三个问题,我不明白第一个问题。什么是“从A级扩展C级”?请问class C < XYZ::A吗?至于第二个问题,您可以简单地通过C.extend(XYZ)扩展C“使用A和B”。至于“你怎么才能包括类A”,没有简单的方法只包含模块的一部分。如果您计划单独包括A类,如果即使没有B也有其自己的问题需要解决,请将其放入单独的模块中并包含该模块。这就是所谓的分离问题。如果你只是想摘樱桃,你可以这样做:

module Something 
    A = XYZ::A 
end 

有你有一个恒定的东西::一个指向相同的类XYZ ::一个。

+0

感谢鲍里斯。通过“从A扩展C类的最佳方式是什么?”我的意思是;我可以做C amjad 2013-04-26 11:41:55

+0

Amjad,'A'和'XYZ :: A'之间的选择与'extend'无关。这仅仅是一个在Ruby中访问常量的问题。防火方式是写':: XYZ :: A'(有点像'\ xyz \ a')。只要您调用的名称空间没有定义另一个常量'XYZ','XYZ :: A'就会工作。只有当你在词汇上处于相同的命名空间时,“A”才起作用,就像定义了A的命名空间一样。查找有关访问Ruby常量的更多学习材料,没有足够的空间在此处进行阐述。 – 2013-04-26 12:31:04

0

这应该工作:

module XYZ 
    class A 
    end 
    class B < A 
    end 
end 

那么对于包括XYZ模块,并从A延伸C:

module ABC 
include XYZ 
    class C < A 
    end 
end