2011-12-26 5 views
1

На одном из классов университета мы должны разрабатывать программы на Java. Одно из требований - назвать все наши файлы с шаблоном surname_firstname_exerciseN_className.java. Другое требование состоит в том, что мы должны разделить наши программы на несколько файлов. Как вы можете себе представить, эти двое не хорошо играют вместе.Открытый класс Java по-разному, чем файл

Я пытаюсь обойти это путем «перевода» моих имен классов. Например, если я пишу класс под названием «Что-то», я делаю это в моем long_prefix_something.java файле:

public class long_prefix_something extends Something {} 

class Something { 
    // class code 
} 

И я хочу использовать класс-то в другом файле. Так что я сделать это в этом другом файле:

class Something2 extends long_prefix_something { } 

Что беспокоит меня, что я не могу перевести long_prefix_something обратно Something из-за круговой ошибки наследования, я должен использовать вместо Something2.

Есть ли способ преодолеть это? Любая аннотация для использования или что-то подобное?

+4

Можете ли вы описать ваши ограничения, которые вы должны были бы так-то вроде этого? – ziesemer

+1

Он просто хочет использовать красивое имя класса вместо уродливого, мне кажется. – AHungerArtist

+0

Кроме того, мне было бы интересно узнать, что привело к принуждению использовать такое глупое ограничение. – AHungerArtist

ответ

0

Нет, это невозможно в Java.

Расширение не будет работать, и наложение псевдонимов, такое как кажется, вы хотите, не существует на Java.

1

Необходимость таких хаков обычно является признаком плохого дизайна. Круговое (и множественное) наследование не разрешено в java.

1

Я согласен (с другими комментаторами), что это звучит немного страшно для меня ... Но там, тем не менее, существует несколько конвенций java для решения проблем, подобных вашим.

Похоже, что вам нужны классы, которые являются более «описательными» для их внутреннего вывода , а затем стандартными классами Java в иерархии наследования.

Ваша потребность может быть удовлетворена двумя стандартными способами: Интерфейсы (время компиляции) или Отражение (время выполнения).

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

Первый способ: С помощью интерфейсов.

1) Преобразование «что-то» в интерфейс 2) Возьмите методы implmentation из порта и их к классу SomethingImpl 3) Просто «abcde12345_something» Реализовать интерфейс «нечто».

2-й метод: используя интроспекцию классов.

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

1) Очевидно, что вы «упаковка» классы - таким образом, вы можете добавить API для ваших обернутых классов, таким образом, что каждый из них обеспечивает «getRootClass()» метод, например:

public class abcde_12345_something extends Something implements RootClassProvider{ 
    public Class getRootClass() 
    { 
     return Something.class; 
    } 
} 

2) Теперь, во время выполнения - если вы не можете (по некоторым причинам), когда вам нужно сделать специальные логические операции на «что-то» объекты, вы можете вызов

if(myabcd_12345.getRootClass().isAssignableFrom(Something)) 
    Something s = (Something) myabcd_12345; 
1

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

т.е. surname_firstname.exerciseN.ClassName вместо surname_firstname_exerciseN_className.java

Смежные вопросы