0 голосов
 
2662 просмотра
24.07.2017 / 04:27  Витаминыч

Можно ли геттеры и сеттеры класса вынести в отдельный интерфейс?

Недавно упоролся и в примере кода для абстрактного класса объявил только поля, а геттеры и сеттеры вынес в интерфейс. Планируется, что реализация будет в наследниках (соответственно и конструктор).

Можно ли так делать? :gg:
24.07.2017 / 06:00  Death
:stranno:
Ответы
 
3 голоса
 
# 24.07.2017 / 09:41  Arigato
Если эти геттеры и сеттеры _действительно_ описывают интерфейс объекта, то почему бы и нет?
 
-1 голос
 
# 24.07.2017 / 10:57  Витаминыч
Block.java
  1. import EBlockType;
  2.  
  3. public abstract class Block implemets IBlock, IDrawable {
  4.     private int ID;
  5.     private String name;
  6.     private EBlockType blockType;
  7.  
  8.     @Override
  9.     public void setId(int i) {}
  10.  
  11.     @Override
  12.     public void setName(String n) {}
  13.  
  14.     @Override
  15.     public void setType(EBlockType bt) {}
  16.  
  17.     @Override
  18.     public void draw() {}
  19.  
  20.     public Block(){}
  21. }

EBlockType.java
  1. public enum EBlockType {
  2.     SAND,
  3.     DIRT,
  4.     WATER,
  5.     STONE
  6. }

IDrawable и IBlock очевидно, что содержат. Далее наследник BlockSand.java
  1. public class BlockSand extends Block {
  2.     @Override
  3.     public void setId(int i) {
  4.         this.ID = i;
  5.     }
  6.     @Override
  7.     public void setName(String n) {
  8.         this.name = n;
  9.     }
  10.     @Override
  11.     public void setType(EBlockType bt) {
  12.         this.blockType = bt;
  13.     }
  14.     @Override
  15.     public void draw() {}
  16.  
  17.     public BlockSand() {
  18.         setId(123);
  19.         setName("Sand");
  20.         setType(EBlockType.SAND);
  21.     }
  22. }

Вот такая дичь в голову пришла :gg: не проверял в IDE, почему-то был уверен, что будет работать, а сегодня начал сомневаться.
24.07.2017 / 11:01  Death
Блин, меня бесит, класс абстрактный, а методы реализованы и пусты. (Block)
Вообще не вижу тут смысла.
Даже у меня плохо с ООП, но я тут вижу много ошибок в логике.
24.07.2017 / 11:18  aNNiMON
Death, перечисли ошибки.
24.07.2017 / 11:31  Death
Ну одну я назвал, то что класс сделал абстрактным, а методы реализовал пустыми.
Второе, я не вижу смысла в IBlock. Это лишние. Блок - объект. Он внутри себя через гетеры и сетеры меняет поля. А если сделать это наследникам класса блок, то им или свои поля для это делать или пользоваться блока полями. Что уже плохо. Есть что нужно от блока переопределить, то наследовать его и перепределить метод какой-то один, а не всем. Много отвественности будет на наследниках таким способом.
24.07.2017 / 11:32  Death
Втретьих, если убрать Block и оставать IBlock, и тогда его реализовавать, то уже больше смысла и логики.
24.07.2017 / 11:51  aNNiMON
То, что класс абстрактный, но методы просто пустые, это нормально. Абстрактный класс не даст создать экземпляр объекта, а пустые методы говорят о том, что их можно переопределить, но не обязательно.
Насчёт IBlock согласен. Грубо говоря, интерфейс это абстрактный класс, у которого все методы абстрактные. Так зачем для одного абстрактного класса добавлять ещё один?
24.07.2017 / 11:52  aNNiMON
Ещё одна ошибка заключается в том, что методы, которые подлежат переопределению вызываются в конструкторе. Любая IDE выдаст на этих строках предупреждение.
А ещё, что за сишарп в моей джавке? За использование C#-конвенций джава-господы опускают и плюют в лицо. Никаких IBlock и EBlockType.
24.07.2017 / 13:50  Витаминыч
Володя, ты так и не смотрел то, что я тебе скинул по ссылке.. а ну бегом читать!
Ишь ты, абстрактный класс ему не нравится! Прежде чем минусить, разберись в вопросе . И еще раз подумай над своими Ataka.class и AtakaObj.class

aNNiMON, каюсь, давно на яве не писал :gg:
Ну то пример :pardon:
24.07.2017 / 13:55  Витаминыч
Насчет переопределеннх методов: почему не стоит их в конструктор пихать?
Много где видел такую запись, все работает.
24.07.2017 / 14:48  Death
aNNiMON, вот, момент спросить. Почему из конструктор нельзя вызывать public методы класса?

Витаминыч, я был прав :кек2: Витя меня поправил, что не так было. У меня именно в Java больше опыта. А у тебя вообще по разным языкам разброс знания. Есть мину и плюсы. А то что Ataka.class и AtakaObj.class было полгода назад. Так что это не считается. Было ведь давно, а я программировал, читал, набивал скилл.
24.07.2017 / 15:48  Arigato
1. Вызов переопределяемых методов может привести к немного неожиданному поведению. Насколько помню, будут вызываться методы родительского класса, а не текущего.
2. Я бы поспорил о ненадобности IBlock. Если бы он имел только геттеры, то его можно было бы спокойно отдавать любому клиентскому модулю.
24.07.2017 / 16:28  Death
aNNiMON, а можно по русски в пару слов объеснить?
24.07.2017 / 18:36  Витаминыч
Ладно, возвращаюсь к С#, Java какая-то немодная :gg:
24.07.2017 / 18:58  Death
На С# собрался... Удачи.
 
-1 голос
 
# 24.07.2017 / 06:55  Koenig
имхо конечно.. но интерфейс не для этого, ну и не за чем в наследников пихать лишнее, там где объявил свойства, там же и сет/гет , опять же не везде нужно, можно сет в конструкторе сделать, а гет отсутствовать, в нужном методе мы все равно имеем доступ к свойству
24.07.2017 / 07:18  Death
Вот-вот!
24.07.2017 / 08:51  Витаминыч
Death, уж не тебе поддакивать :facepalm:
 
-2 голоса
 
# 24.07.2017 / 06:07  Витаминыч
В С# над этим даже не думаешь, просто объявляешь свойство и все. Get и Set сгенерируются. К хорошему привыкаешь быстро и автоматически начинаешь искать легкий путь :gg:
24.07.2017 / 09:30  SeTSeR
Тащемта, идея умеет генерировать геттеры и сеттеры, нб вроде тоже, так что тут об этом тоже думать не надо :gg:
24.07.2017 / 10:58  Витаминыч
SeTSeR, да, но так то стопудово не забудешь :gg:
Всего: 4

Реклама

Мы в соцсетях

tw tg yt gt