Skip to content

Instantly share code, notes, and snippets.

@spareslant
Created September 20, 2016 19:51
Show Gist options
  • Save spareslant/26a196237293c9de1dc377c43822794d to your computer and use it in GitHub Desktop.
Save spareslant/26a196237293c9de1dc377c43822794d to your computer and use it in GitHub Desktop.
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