Существует ли преимущество для наличия и абстрактный класс и интерфейс?

я нашел решение: измените настройку DNS виртуальной машины, указывая на Google DNS

dns-nameservers 8.8.8.8       8.8.4.4

Затем

vagrant halt

vagrant up

, но мы нужно попробовать в другое время с хорошей скоростью интернета

Откройте файл / etc / network / interfaces с помощью этой команды: sudo vi /etc/network/interfaces
и .. Указывая на Google DNS

, файл интерфейса должен быть таким, как показано ниже:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

    # The loopback network interface
    auto lo
    iface lo inet loopback

    # The primary network interface
    auto eth0
    iface eth0 inet dhcp
    pre-up sleep 2

    dns-nameservers 8.8.8.8   8.8.4.4

См. также эту ссылку: https://github.com/docker/ имеющиеся в наличии для победы / вопросы / 611

11
задан Toon Krijthe 5 November 2008 в 23:03
поделиться

10 ответов

Определенно. Давайте думать о конкретном примере.

Скажите, что у нас есть абстрактный класс Animal. Скажите, мы делаем некоторые подклассы Cat, Dog, Mosquito, и Eagle. Мы можем реализовать Eat(), Breathe(), Sleep() методы абстрактного класса Animal.

Пока все хорошо. Теперь, скажем, мы хотим иметь Fly() метод для Mosquito и Eagle классы. Так как эти два организма не действительно хорошо связаны (каждый - птица, другой - насекомое), не было бы легко придумать общего предка для двух, что мы можем иметь как абстрактный класс. Это было бы лучше всего реализовано интерфейсом IFly.

IFly интерфейс может иметь a Fly() метод, который будет реализован. Оба Mosquito и Eagle классы могут оба быть подклассами абстрактного класса Animal и реализуйте интерфейс IFly и смогите к Eat(), Breathe(), Sleep() и Fly() не имея некоторого типа нечетных ancenstral отношений между этими двумя классами.

15
ответ дан 3 December 2019 в 03:54
поделиться

Я обычно кодирую против абстрактных классов, когда это имеет смысл и реализацию (и создайте во внешнем блоке/библиотеке контрактов), интерфейс в каждом классе (краткий обзор или не), таким образом, я могу более легко реализовать Windows Communication Foundation или инверсию управления, когда необходимый (который является почти всегда для насмешки). Это стало второй натурой для меня.

4
ответ дан 3 December 2019 в 03:54
поделиться

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

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

2
ответ дан 3 December 2019 в 03:54
поделиться

Если Ваш абстрактный класс является единственным классом, который будет когда-либо реализовывать интерфейс, то можно всегда просто проверять на экземпляры абстрактного класса, Вам не нужен интерфейс. Но если Вы хотите быть совместимыми с будущим с новыми классами, еще не записанными, который не расширит абстрактный класс, но мог использовать интерфейс, затем продолжать использовать интерфейс теперь.

2
ответ дан 3 December 2019 в 03:54
поделиться

Я соглашаюсь с cfeduke. Я ВСЕГДА запускаю с интерфейсов, и в прошлом использовали абстрактные классы, которые реализуют интерфейсы и обеспечивают основную функциональность для продвижения повторного использования кода среди классов, которые наследовались абстрактному классу. Насмешка и МОК является вообще говоря, интерфейсным зависимым, поэтому одним, я использовал бы интерфейсы в своих проектах.

1
ответ дан 3 December 2019 в 03:54
поделиться

Ваш интерфейс определяет контракт, который должен быть выполнен для объекта, который будет принят; Ваш абстрактный класс определяет контракт, который должен быть выполнен И определяет некоторые определенные детали реализации.

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

Нет почти никаких издержек, вовлеченных в наличие и абстрактный класс и интерфейс; Ваш риск с тем подходом, прежде всего, вовлекает более поздний кодер, сталкивающийся с интерфейсом, не понимая, что существует абстрактный класс, который реализует интерфейс и создание всей реализации с нуля, где это не должно быть. Я сказал бы, что это могло обойтись путем указывания в интерфейсной документации, что существует реализация "по умолчанию" интерфейса в абстрактном классе; в то время как некоторые стандарты кодирования могут осудить ту практику, я не вижу настоящих проблем с нею.

1
ответ дан 3 December 2019 в 03:54
поделиться

Если абстрактный класс имеет функциональность, мудро сохранить его. Но если это только содержит абстрактные методы и никакие поля. Я вижу быть бесполезное в хранении обоих.

Править: Я работаю над унаследованным кодом с большим количеством абстрактных классов. Если у меня когда-нибудь будет время, то я добавлю интерфейсы, (и возможно удалю пустые краткие обзоры). Поскольку работа с интерфейсами значительно улучшает возможности. И они соблюдают свое имя путем точного определения интерфейса.

1
ответ дан 3 December 2019 в 03:54
поделиться

Принятие Вас спрашивает конкретно, когда интерфейс и абстрактный класс имеют идентичные подписи...

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

... но принятие участников идентично, затем единственная причина, о которой я могу думать для необходимости, оба - то, если Вы кодируете в системе, которая не позволяет нескольким наследование реализации, там два класса в Вашей системе, которая должна быть полиморфно аналогичной, но должна наследоваться различным базовым классам...

0
ответ дан 3 December 2019 в 03:54
поделиться

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

Вы могли расширить функциональность подклассов путем создания нового Интерфейса с другим набором методов.

0
ответ дан 3 December 2019 в 03:54
поделиться

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

Библиотеки классов Microsoft способствуют абстрактным классам по интерфейсам во многих случаях, потому что это позволяет им изменить базовый класс. Добавление метода к абстрактному классу редко повреждает кого-то, кто наследовался ему. Добавление метода к интерфейсу всегда повреждает своих конструкторов. Однако это обеспечивает одну из лучших причин использования интерфейсов: ужасная возможность, что Microsoft, возможно, уже израсходовала Ваше одно наследование.

Я предположил бы, однако, что в Вашем особом случае можно хотеть пересмотреть шаблон разработки, который Вы используете. Кажется необычным иметь много классов "типа входа в систему".

0
ответ дан 3 December 2019 в 03:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: