Created
September 20, 2016 19:51
-
-
Save spareslant/26a196237293c9de1dc377c43822794d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class A | |
def methoda_public | |
puts "Hello from methoda_public self=#{self}" | |
end | |
def methoda_private | |
puts "Hello from methoda_private self=#{self}" | |
end | |
def methoda_protected | |
puts "Hello from methoda_protected self=#{self}" | |
end | |
# 1) Java => class methods are defined using static keyword. instances can access class methods in Java. | |
# 2) Ruby => class methods are actually singleton methods of class itself. (in Ruby a class is an object itself.). class methods are actually defined in | |
# singleton class of "class object" and hence called as singleton methods. Only that object can call singleton method on which it is defined and none other. | |
# Singleton methods are Exclusive to a single particular object only. Hence even the instances created from class A cannot access class methods. | |
# derived class can invoke base class' singleton object. Again instances of Derived class cannot access singleton method defined on base class. | |
def self.methoda_classmethod_public | |
puts "hello from methoda_classmethod_public self=#{self}" | |
end | |
private :methoda_private | |
protected :methoda_protected | |
end | |
class B < A | |
def public_methodb_calling_private_methoda | |
# 1) Java => private members are not inherited directly in derived class. So this will not work in Java. | |
# Derived class inherits base class' protected and public members. So if Base class' protected/public method access private member | |
# then Derived class can also 'work' on private member via inherited protected/public methods. | |
# 2) Ruby => private members are inherited in Ruby. So this will work in ruby. | |
methoda_private | |
# 1) Java => you cannot access private memebers directly in derived class. So this will not work in Java. | |
# 2) Ruby => Will not work as private members must be accessed WITHOUT explicit receiver in derived class. | |
#A.new.methoda_private # A new object is created and we are trying to access its private member. will not work. | |
#self.methoda_private # An equivalent in Java would be this.methoda_private(). But ofcourse in Java private members are not inherited so will not work. | |
# 1) Java => Protected members can be accessed in derived class directly becuase they are inherited. So this will work. | |
# 2) Ruby => Protected members are inherited in Ruby as well. So this will work. | |
methoda_protected | |
# 1) Java => protected memeber cannot be accessed in drived class using reference variable(i.e. by creating object). | |
# 2) Ruby => This will work. But this will NOT work in Ruby also if below expression i.e. A.new.methoda_protected is called outside class B. | |
A.new.methoda_protected | |
# 1) Java => A Java equivalent would be this.methoda_protected() . This will work in Java. As protected methods are inherited in Java directly. Needed verification. | |
# 2) Ruby => This will work. Ruby will be calling inherited method. Java will also do the same. | |
self.methoda_protected | |
# 1) Java => Instance method can call static method (class method). | |
# 2) Ruby => This will not work. Instance method CANNOT call class method. | |
#methoda_classmethod_public | |
# 1) Java => instance method can call static method (class method). In java it would be this.methoda_classmethod_public() | |
# 2) Ruby => this will not work. Because inside instance method self will be referring to the instance of B. And instance of B CANNOT call | |
# singleton method of class A. | |
#self.methoda_classmethod_public | |
end | |
# 1) Java => Both below statements are not allowed in Java. These are called outside any method definition. | |
# 2) Ruby => Both below will work in Ruby. Hence class methods are inherited but only to be called by derived class itself. | |
# class methods are singleton method. Normally singleton methods are called by only their own onjects. | |
# But when in case of singleton methods defined on class (class methods), they can be called by dervied class also. (Not by derived class instances). | |
methoda_classmethod_public | |
self.methoda_classmethod_public | |
end | |
#A.new.methoda_private # => will not work. (same as in Java) | |
#A.new.methoda_protected # => will not work. (same as in Java). Compare and take a note of this expression inside class B as well. | |
#A.new.methoda_classmethod_public # => Will not work in Ruby but will work in Java. Java syntax would be: A a = new A(); a.methoda_classmethod_public() . | |
B.new.public_methodb_calling_private_methoda | |
B.methoda_classmethod_public # => will work both in Java and Ruby |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment