Создание подклассов из статических методов - PullRequest
4 голосов
/ 30 июня 2010

Я думаю, что, возможно, нет способа сделать это, но я подумал, что стоит спросить.Я хочу сделать что-то вроде следующего:

public class Super {
    public static String print() { System.out.println(new Super().getClass().getSimpleName()); }
    public Super() {}
}

public class Subclass extends Super {
    public Subclass() {}

    public void main(String[] args) {
        Super.print();
        Subclass.print();
    }
}

Я надеюсь, что Super.print () будет отображать «Super», а Subclass.print () - «Subclass».Однако я не вижу, как это сделать из статического контекста.Спасибо за помощь.

Я хорошо знаю, что я могу сделать это без статических методов, и что я могу передать класс в каждый вызов метода.Я не хочу этого делать, поскольку для этого требуется переопределить несколько статических методов во многих подклассах.

Ответы [ 2 ]

9 голосов
/ 30 июня 2010

Вы можете просто определить отдельный метод Subclass.print() с желаемой реализацией.Статические методы имеют область видимости класса, поэтому каждый подкласс может иметь свою собственную реализацию.

public class Subclass {
    public Subclass() {}
    public static String print() {
        System.out.println(Subclass.class.getSimpleName());
    }

    public void main(String[] args) {
        Super.print();
        Subclass.print();
    }
}

Обратите внимание, что ваш код может быть несколько упрощен - достаточно Super.class вместо new Super().getClass().

Также обратите внимание, что статические методы не полиморфны -Super.print() и Subclass.print() всегда будут вызывать метод в соответствующем классе.Вот почему они привязаны к классу, а не к объекту.

Если у вас большая иерархия классов, вы можете получить много дублирующегося кода, внедрив в каждый отдельный статический print().Вместо этого вы можете определить один нестатический метод для выполнения работы:

public abstract class Super {
    public final String print() {
        System.out.println(this.getClass().getSimpleName());
    }
    ...
}

Обратите внимание, что этот метод даже не должен быть полиморфным - this.getClass() всегда будет возвращать фактический токен подкласса.

Обратите внимание, что я объявил Super как abstract - это (почти всегда) хорошая практика для базовых классов.

0 голосов
/ 30 июня 2010

Вы можете сделать это без использования статических методов

public class Parent {
  public print(){
    System.err.println(this.getSimpleName());
  }
}

public class Child extends Parent {
  public void main(String[] args) {
     Parent p = new Parent();
     p.print(); 
     Child c = new Child();
     c.print();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...