[JAVA] Les méthodes privées peuvent ou ne peuvent pas être remplacées par des méthodes publiques

Pour le rubis

Tout d'abord, le rubis.

ruby2.4


class Foo
  private
  def hoge
    p :hoge_in_Foo
  end
end

class Bar < Foo
  def hoge #Il peut être remplacé sans erreur
    p :hoge_in_Bar
  end
end

b = Bar.new
b.hoge # Bar#hoge est appelé

Vous pouvez simplement le remplacer. Il n'y a pas d'avertissement. Je pense que cela causera des problèmes.

Pour Java

Pour Java:

Foo.java


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

Bar.java


class Bar extends Foo
{
  @Override
  public void hoge(){ //=>Erreur:La méthode ne remplace ni n'implémente la méthode de supertype
    System.out.println( "hoge in Bar" );
  }
  public static void main( String[] args ){
    (new Bar()).hoge();
  }
}

Si vous le faites, une erreur se produira comme décrit dans le commentaire ci-dessus. préférable. Le hoge de Foo n'est pas une méthode remplaçable en premier lieu, c'est donc naturel. Donc, sans " @ Override ", il n'y aura ni erreur ni avertissement.

Pour 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
}

Peut être remplacé normalement. Bien sûr, il peut être remplacé car la hoge de Foo est virtuelle. Cependant, il n'est pas surprenant que l'avertissement n'apparaisse pas même si la visibilité passe de privé à public. En premier lieu, il est normal de donner un avertissement lorsqu'il est privé et virtuel.

Recommended Posts

Les méthodes privées peuvent ou ne peuvent pas être remplacées par des méthodes publiques
Organiser les méthodes qui peuvent être utilisées avec StringUtils