переменная-член доступа Android расширенного customListAdapter - PullRequest
1 голос
/ 11 ноября 2011

Я сталкиваюсь со странным поведением ООП (IMO) в Android и, возможно, в Java в целом ... У меня есть действие, и внутри него я создаю экземпляр объекта CustomSimpleCursorAdapter, который является классом, расширяющим SimpleCursorAdapter.В моем пользовательском классе у меня есть некоторые переменные-члены.Когда я создаю объект этого класса, я хочу иметь доступ к переменной члена вновь созданного объекта.Мой опыт ООП подсказывал мне, что должно быть достаточно:

ListAdapter listAdapter = new TrainingsListCursorAdapter(...);
listAdapter.currentWidth = 100;

ПРИМЕЧАНИЕ: currentWith переменная объявлена ​​общедоступной ...

(Eclipse) не хочетдля компиляции, поэтому я подумал, что, возможно, открытый сеттер setCurrentWidth() в пользовательском классе решит это.Я объявил переменную-член private и мой метод установки общедоступный ....

ListAdapter listAdapter = new TrainingsListCursorAdapter(...);
listAdapter.setCurrentWidth(100);

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

Исправление, которое затмение предлагало навязчиво и в конце концов работает!следующий код:

((TrainingsListCursorAdapter) listAdapter).setOrientationWidth(100);

Может кто-нибудь объяснить мне этот синтаксис и необходимость такого литья ?!... и что не так с:

  • создать экземпляр объекта
  • получить к нему доступ к общедоступным установщикам / получателям или непосредственно к переменным-членам

1 Ответ

3 голосов
/ 11 ноября 2011

Это совсем не странно. Переменная listAdapter имеет тип ListAdapter. Компилятору было все равно, какие назначения выполнялись в предыдущих строках. Если вы попытаетесь получить доступ к члену, который не известен через ListAdapter, компилятор будет правильно жаловаться.

Более простое исправление, чем приведение, - объявить переменную как тип, который вам нужен , чтобы иметь доступ к вашим конкретным членам:

TrainingsListCursorAdapter listAdapter = new TrainingsListCursorAdapter(...);
listAdapter.currentWidth = 100;

или

TrainingsListCursorAdapter listAdapter = new TrainingsListCursorAdapter(...);
listAdapter.setOrientationWidth(100);

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

Чтобы привести более простой пример для распространенных типов, вы не можете написать:

Object text = "hello";
int length = text.length();

потому что length() - это метод на Object, он только на String. Когда компилятор видит выражение text.length(), он просматривает объявленный тип переменной text (т.е. в данном случае Object) и ищет метод length() для этого типа.

Итак, вместо этого вы должны выполнить приведенный выше код:

String text = "hello";
int length = text.length();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...