2013-07-15 2 views
1

У меня есть несколько различных реализаций объекта, которые реализуют этот пользовательский номер interface, который я сделал по телефону Board.Вызов переопределяемого метода в конструкторе

Board содержит метод, который выглядит следующим образом

public void ConvertFromString(String formattedString); 

Каждый объект, реализующий Board вызовы ConvertFromString() в своем конструкторе.

Похоже на следующее.

public void BoardImpl1 implements Board 
{ 
    public Board(string B) 
    { 
     ConvertFromString(b); 
    } 

    public void ConvertFromString(String formattedString) 
    { 
     //do some parsing on string and set up the BoardImpl properties 
    } 
} 

ConvertFromString быть общественности вызывает предупреждение, поэтому один из обходных путей, которые я нашел бы сделать BoardImpl окончательным. Есть ли лучший способ приблизиться к этому?

+0

у вас есть класс с именем 'BoardImpl1', почему бы вам не сделать' Board' абстрактный класс вместо интерфейса? –

+0

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

ответ

2

// сделать некоторые синтаксический на строки и настроить свойства BoardImpl

Метод должен быть подотчетен convertFromString только.

1) Сделать метод окончательного

public class BoardImpl implements Board{ 

    public void final convertFromString(String formattedString) 
    { 
     //do some parsing on string and set up the BoardImpl properties 
    } 

} 

2) Решения сделать abstract class и вызвать конструктор суперкласса, так что вы не должны вызывать в каждом подклассе НО не использовать свойство из подкласса, потому что они не интеридированы.

public abstract class AbstractBoard implements Board{ 

    public AbstractBoard(String s){ 
     convertFromString(s); 
    } 

} 

3) И Я предпочитаю один сделать что-то с составом

public class Client { 

private Board board; 

    public Client(String s){ 
    board.convertFromString(s); 
    } 

public void setBoard(Board board){ 
     this.board = board; 
} 

} 

Тогда в совет вы можете делегировать ResponsAbility в решающем Wich совета вы должны использовать на заводе, или если он не имеет состояния FlyweightFactory

+0

Мне нравится идея номер 3. Im ищет создание фабрики, которая вернет мне «BoardImpl» и вызовет метод «convertFromString». Проблема с абстрактным классом заключается в том, что он не гарантирует, что будет определен 'convertFromString', и мне нужно отдельное определение для каждой реализации интерфейса' Board'. – Rhs

+0

@Rhs. Да, третий лучше, и если вы смешиваете с на фабрике лучше, вы можете использовать «Flyweight», если «классы стратегий» не имеют внутреннего состояния. – nachokk

1

Действительно ли ConvertFromString действительно относится к интерфейсу Board? Что делать, если у вас была доска, которая инициализировала свои свойства другим способом? Я бы подумал о том, как реорганизовать класс доски.

public class Board { 
    public Board(Properties properties) {...} 
} 

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

+0

'convertFromString' происходит от интерфейса, поэтому я не могу отметить функцию, защищенную или закрытую. – Rhs

+0

Извините, моя вина. Здесь будет обновлен мой ответ. –

0
  1. Существует ошибка компиляции в коде
  2. Я не мог получить компиляции предупреждение с Следующий код

    public interface Board { 
    
        public void ConvertFromString(String formattedString); 
    
    } 
    
    
    public class BoardImpl1 implements Board { 
    
        public BoardImpl1(String b) { 
    
        ConvertFromString(b); 
    
        } 
    
        public void ConvertFromString(String formattedString) { 
    
        //bla bla 
    
        } 
    
    } 
    
+0

Это не ответ –

+0

@MrD Вы правы ... Но, к сожалению, я не мог комментировать сообщение другого пользователя раньше 50 репутации ... Итак, я удалю этот «ответ» после того, как Rhs прочитает его или есть другой способ уведомить его о том, что его код имеет ошибку компиляции? Благодарю. –

+0

вы можете рассмотреть возможность удаления; в }; в интерфейсе – nachokk

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