コンストラクタからのインスタンスメソッドの呼び出しは必要か?
こんにちは。コンストラクタに関して教えてください。
コンストラクタからインスタンスメソッドを呼び出す場合には下記のような
注意が必要ですが、そもそもそんな注意が必要な仕様にしてまで呼び出せる
ようにする必要があるのでしょうか?
単純に呼び出せないようにすれば良いのではないでしょうか?
■コンストラクタからのインスタンスメソッド呼び出しの注意
◇C++等の場合
メソッドがサブクラスでオーバーライドされていても、サブクラスの
メソッドではなく自クラスのメソッドが呼び出される。
◇Ruby,Java等の場合
メソッドがサブクラスでオーバーライドされている場合、サブクラスの
メソッドが呼び出されるが、サブクラスでのコンストラクトが完了して
いない可能性がある。
■例
◇C++の場合
・ソースプログラム
#include <string>
#include <iostream>
class SuperClass
{
std::string x_;
public:
SuperClass(const std::string &x):
x_(x)
{
method();
}
virtual ~SuperClass() {}
virtual void method() const {
std::cout << "in SuperClass#method\n";
std::cout << x_ << "\n";
}
};
class SubClass: public SuperClass
{
std::string y_;
public:
SubClass(const std::string &y):
SuperClass(y),
y_(y + "def")
{
}
virtual ~SubClass() {}
virtual void method() const {
std::cout << "in SubClass#method\n";
std::cout << y_ << "\n";
}
};
int main()
{
SubClass obj("abc");
obj.method();
}
・実行結果
in SuperClass#method
abc
in SubClass#method
abcdef
◇Rubyの場合
・ソースプログラム
#/usr/local/bin/ruby
class SuperClass
def initialize(x)
@x = x
method()
end
def method
puts 'in SuperClass#method'
puts @x
end
end
class SubClass < SuperClass
def initialize(y)
super(y)
@y = y + 'def'
end
def method
puts 'in SubClass#method'
puts @y
end
end
obj = SubClass.new('abc')
obj.method
・実行結果
in SubClass#method
nil
in SubClass#method
abcdef
--
pegacorn
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735