2010-06-30 2 views
4

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

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(), чтобы показать, «Супер» и Subclass.print(), чтобы показать «Подкласс». Однако я не вижу, как это сделать из статического контекста. Спасибо за помощь.

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

+0

Вы могли бы хотеть иметь Подкласс продлить супер так что он может назвать печать() и иметь печать() возвращает строку или изменить свою подпись к мочеиспусканию .. просто FYI. –

+0

Я добавил расширение для моего примера. Я изначально собирался положить его туда и забыл. – Blacktiger

ответ

9

Вы можете просто определить отдельный метод 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

Это хороший ответ, но, к сожалению, он действительно не решает проблему, которую я надеюсь решить. Я не уверен, что в Java есть реальное решение. – Blacktiger

0

Вы можете сделать это с помощью с помощью статических методов

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(); 
    } 
} 
Смежные вопросы