создание экземпляра класса с использованием интерфейса и реализации - PullRequest
2 голосов
/ 14 января 2010

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

Пример:

IBlah blah = new BlahImpl();

Как бы вы это прочитали?

Это:

Ссылочная переменная бла типа IBlah создается с помощью класса BlahImpl?

И поэтому ссылочная переменная будет привязана к IBlah, и, следовательно, будет иметь только методы / экземпляр и статические переменные IBlah, но использовать реализацию классов этих свойств / переменных BlahImpl?

Просто пытаюсь исправить мою терминологию.

Ответы [ 3 ]

8 голосов
/ 14 января 2010

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

Рассмотрим следующую иерархию классов:

    IBlah
      ^
      |
AbstractBlah
      ^
      |
   BlahImpl

Если IBlah является интерфейсом и AbstractBlah является абстрактным классом, а BlahImpl является конкретным классом, следующие строки кода недопустимы:

IBlah blah1 = new IBlah();
IBlah blah2 = new AbstractBlah();
AbstractBlah blah3 = new AbstractBlah();

Допустимы следующие строки кода:

IBlah blah1 = new BlahImpl();
AbstractBlah blah3 = new BlahImpl();

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

Вы можете обращаться к конкретному классу и использовать его через интерфейс или переменную абстрактного класса. Фактически это поощряется, поскольку программирование абстрактного класса (или интерфейса) делает ваш код более гибким.

Можно создать конкретный класс из интерфейса или абстрактного класса на месте. Итак, если у нас есть такой интерфейс:

interface IBlah {
    void doBlah();
}

Этот интерфейс может быть реализован и реализован одним махом следующим образом:

IBlah blah = new IBlah() {
    public void doBlah() {
        System.out.println("Doing Blah");
    }
};
1 голос
/ 14 января 2010

"Объект BlahImpl создается и присваивается переменной blah как реализация интерфейса IBlah." Мы также могли бы назвать это приведением, поскольку существует неявное приведение, назначив его таким образом.

Редактировать: ваш первый ответ тоже звучит разумно, второй - нет.

0 голосов
/ 14 января 2010

Может быть, это яснее:

Создайте новый экземпляр BlahImpl и приведите его к IBlah и назначьте его blah.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...