LoginSignup
5
2

More than 5 years have passed since last update.

private なメソッドを public なメソッドで オーバーライド出来たり出来なかったり

Posted at

ruby の場合

まずは ruby。

ruby2.4
class Foo
  private
  def hoge
    p :hoge_in_Foo
  end
end

class Bar < Foo
  def hoge # エラーにならず、オーバーライド出来てしまう
    p :hoge_in_Bar
  end
end

b = Bar.new
b.hoge # Bar#hoge が呼ばれる

だまって override 出来てしまう。
警告は出ない。
トラブルの原因になると思う。

Java の場合

Java の場合は:

Foo.java
class Foo
{
  private void hoge(){ System.out.println( "hoge in Foo" ); }
}
Bar.java
class Bar extends Foo
{
  @Override
  public void hoge(){ //=>エラー: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません
    System.out.println( "hoge in Bar" );
  }
  public static void main( String[] args ){
    (new Bar()).hoge();
  }
}

などとやると、上記のコメントの通りエラーになる。好ましい。
そもそも Foo の hoge はオーバーライド可能なメソッドではないんだから、当たり前。
なので、「@Override」がないと、エラーも警告も出ない。

C++ の場合

c++11
#include <iostream>

class Foo
{
  private:
    virtual void hoge(){ std::cout << "hoge in Foo\n"; }
};
class Bar: public Foo
{
  public:
    virtual void hoge() override { std::cout << "hoge in Bar\n"; }
};

int main()
{
  Bar bar;
  bar.hoge(); // okay
}

普通にオーバーライドできる。
オーバーライドできるのは、Foo の hoge が virtual なんだから当然。
ただ、可視性を private から public に変更していても警告が出ないのはどうかなと思わなくもない。
そもそも private で virtual という時点で警告を出してくれてもいいかもと思わなくもない。

※ C# だとどうなるんだっけ?

5
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2