[JAVA] Private Methoden können durch öffentliche Methoden überschrieben werden oder nicht

Für Rubin

Zuallererst Rubin.

ruby2.4


class Foo
  private
  def hoge
    p :hoge_in_Foo
  end
end

class Bar < Foo
  def hoge #Es kann fehlerfrei überschrieben werden
    p :hoge_in_Bar
  end
end

b = Bar.new
b.hoge # Bar#hoge heißt

Sie können es einfach überschreiben. Es gibt keine Warnung. Ich denke, es wird Ärger verursachen.

Für Java

Für Java:

Foo.java


class Foo
{
  private void hoge(){ System.out.println( "hoge in Foo" ); }
}

Bar.java


class Bar extends Foo
{
  @Override
  public void hoge(){ //=>Error:Die Methode überschreibt oder implementiert die Supertyp-Methode nicht
    System.out.println( "hoge in Bar" );
  }
  public static void main( String[] args ){
    (new Bar()).hoge();
  }
}

Wenn Sie so etwas tun, wird eine Fehlermeldung angezeigt, wie im obigen Kommentar beschrieben. bevorzugt. Foo's Hoge ist in erster Linie keine überschreibbare Methode, daher ist es natürlich. Ohne " @ Override "gibt es also keinen Fehler oder eine Warnung.

Für 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
}

Kann normal überschrieben werden. Natürlich kann es überschrieben werden, da Foo's Hoge virtuell ist. Es ist jedoch nicht überraschend, dass die Warnung nicht angezeigt wird, selbst wenn die Sichtbarkeit von privat zu öffentlich geändert wird. Erstens ist es in Ordnung, eine Warnung zu geben, wenn es privat und virtuell ist.

Recommended Posts

Private Methoden können durch öffentliche Methoden überschrieben werden oder nicht
Organisieren Sie Methoden, die mit StringUtils verwendet werden können