Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

Реализовать доп. функциональность в классах
Список форумов
 ->  Основы языка Java


 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
trarex : 123
Новичок
Откуда: Киев

СообщениеФев 03, 2012 15:23 
Ответить с цитатой
Есть примерно следующий код:

Код:

class Class1 extends Class2 {
    void cannotRenameMethod() {
        //some commands
    }
}


Нужно реализовать следующее:

Код:

class Class1 extends Class2 {
    void cannotRenameMethod() {
        thread1_declaration {
            //some commands
        }
        thread1.start();
        //additional commands new
    }
}


Проблема в том, что второй вариант нужно реализовать примерно в 20-30 классах, а просто добавление по 10-20 одинаковых строк в 20-30 классов (а потом еще в каждый новый, коих будет очень много) не разрешат. Собственно вопрос, как это все "причесать", что бы в каждый из многих классов добавлять минимум кода? Мне кто-то шепнул слово "аннотация", но с ними я "не очень".

Родительский класс правитель нельзя, если что.
К началу Посмотреть профиль Отправить личное сообщение
мсье клоц : 562
Постоянный посетитель

СообщениеФев 03, 2012 16:10 
Ответить с цитатой
А есть возможность сделать другой класс, который бы реализовывал одинаковости?

Код:
class Class1 extends Class2 {
       void cannotRenameMethod() {
           thread1_declaration {
               //some commands
           }
           thread1.start();
       }
   }


Код:
class AnotherClass extends Class1 {
       void cannotRenameMethod() {
                super.cannotRenameMethod();
               //additional commands new
       }
   }
К началу Посмотреть профиль Отправить личное сообщение
trarex : 123
Новичок
Откуда: Киев

СообщениеФев 03, 2012 16:31 
Ответить с цитатой
Возможность то есть, но вот также Smile дело в том, что для каждого из 20-30 классов набор команд
Код:
//some commands

разный(надо было написать //some list1 of commands), по-этому
Код:
super.cannotRenameMethod();

для каждого случая будет другим, что означает создание большого количества классов AnotherClass, что не на много лучше, чем добавление в каждый класс по 10-20 одинаковых строк
К началу Посмотреть профиль Отправить личное сообщение
мсье клоц : 562
Постоянный посетитель

СообщениеФев 03, 2012 16:34 
Ответить с цитатой
Класс, а что именно у них одинаковое, в смысле, есть ли какая-то закономерность? Very Happy

Я-то предлагал не готовое решение, а идею: вычленить общее и пихнуть в отдельный класс, от которого затем и наследоваться.
К началу Посмотреть профиль Отправить личное сообщение
trarex : 123
Новичок
Откуда: Киев

СообщениеФев 03, 2012 16:42 
Ответить с цитатой
если по сути, то в каждом i классе есть свой метод

Код:
void cannotRenameMethod_name#i() {
    // realization_#i
}


для каждого метода нужно по сути сделать следующее:

Код:
void cannotRenameMethod_name#i() {
    thread_declaration {
        // realization_#i
        // some thread flags, the same for every realization
    }
    thread.start();
    // additional commands, the same for every method
}


Структура проекта такова:
ParentClass //cannot change
|---->Class1 -> void cannotRenameMethod_name#1
|---->Class2 -> void cannotRenameMethod_name#2
|---->...
|---->Classi -> void cannotRenameMethod_name#i
|---->...
|---->ClassN -> void cannotRenameMethod_name#N

N ~ 20-30
==============================
update: проблема решена(скорее всего, решение еще не проверял), тему можно закрыть Laughing
К началу Посмотреть профиль Отправить личное сообщение
мсье клоц : 562
Постоянный посетитель

СообщениеФев 03, 2012 17:27 
Ответить с цитатой
Где-то в документации читал, что аннотации позволяют сгенерировать куски кода по шаблону, так что, скорее всего, так и следует это делать. Однако это практически всё, что мне о них известно.

trarex писал(а):

update: проблема решена(скорее всего, решение еще не проверял), тему можно закрыть Laughing
Каким способом, может, и мне пригодится? xD
К началу Посмотреть профиль Отправить личное сообщение
trarex : 123
Новичок
Откуда: Киев

СообщениеФев 03, 2012 18:01 
Ответить с цитатой
не знаю, работает или нет - не проверял

идея такова:

Код:
Class2 -->AddFunctionalityClass --> Class1

abstract class AddFunctionalityClass() {
    methodWithThreadAndNeededRealization() {
        //bla-bla-bla
        testSingleName();
        //bla-bla-bla
    }

    absrtact testSingleName();
}


наверное стоило добавить, что у меня cannotRenameMethod_name#i должен иметь одно и от же начало, а именно testXXX
К началу Посмотреть профиль Отправить личное сообщение
Vantuz-Subhuman : 660
Постоянный посетитель
Откуда: издиснейленда

СообщениеФев 03, 2012 18:36 
Ответить с цитатой
trarex писал(а):
не знаю, работает или нет - не проверял

идея такова:

Код:
Class2 -->AddFunctionalityClass --> Class1

abstract class AddFunctionalityClass() {
    methodWithThreadAndNeededRealization() {
        //bla-bla-bla
        testSingleName();
        //bla-bla-bla
    }

    absrtact testSingleName();
}


наверное стоило добавить, что у меня cannotRenameMethod_name#i должен иметь одно и от же начало, а именно testXXX


Это вы юнит-тесты так пишете? И вам нужно, чтобы они в разных потоках работали?
_________________
«One should never underestimate the predictability of stupidity»,
«Never attribute to malice that which can be adequately explained by stupidity»
К началу Посмотреть профиль Отправить личное сообщение
trarex : 123
Новичок
Откуда: Киев

СообщениеФев 03, 2012 18:39 
Ответить с цитатой
нет, нужно реализовать проверку времени выполнения (что бы не превышало timeout) теста. проблема в том, что проект на android, и использовать @Test(timeout=XXX) не представляется возможным. Данная аннотация просто игнорится
К началу Посмотреть профиль Отправить личное сообщение
loptop : 143
Новичок

СообщениеФев 04, 2012 22:06 
Ответить с цитатой
А что если создать абстрактный класс(Parent), который будет родительским к классам которые должны делать доп. работу(сделать в ней функцию work()). Потом от него реализовать 1...N классов, которые будут реализовывать эту функцию и будут отличатся реализацией(например DoSlow,DoFast).
И соответственно нужно будет только передавать или создавать в каждом классе один из дочерних экземпляров класса Parent, и работать с ним.
К началу Посмотреть профиль Отправить личное сообщение
mesier : 693
Постоянный посетитель
Откуда: Новокузнецк

СообщениеФев 05, 2012 5:05 
Ответить с цитатой
trarex писал(а):
Проблема в том, что второй вариант нужно реализовать примерно в 20-30 классах, а просто добавление по 10-20 одинаковых строк в 20-30 классов (а потом еще в каждый новый, коих будет очень много) не разрешат. Собственно вопрос, как это все "причесать", что бы в каждый из многих классов добавлять минимум кода? Мне кто-то шепнул слово "аннотация", но с ними я "не очень".
Родительский класс правитель нельзя, если что.


Шаблон есть такой - Фабричный метод.
Прям ваш случай!
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
 
Начать новую тему  Ответить на тему
Страница 1 из 1
Список форумов
 -> Основы языка Java


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru