Потребность в Абстрактном классе, а также Интерфейсе?

Этого также можно достичь с помощью apply, который ссылается на значения в Vented_Days и просто возвращает top 1 для каждой строки. cross apply не будет возвращать значения null, тогда как outer apply будет:

declare @vd table(MRN int,AdmissionDate date);
declare @mar table(MRN int,AdmissionDate date);

insert into @vd values
 (1,'20190102')
,(1,'20190106')
,(2,'20190104')
,(3,'20190101');

insert into @mar values
 (1,'20190101')
,(1,'20190105')
,(2,'20190102');

select v.MRN
        ,v.AdmissionDate
        ,m.AdmissionDate
from @vd as v
    outer apply (select top 1 m.AdmissionDate
                 from @mar as m
                 where v.MRN = m.MRN
                    and v.AdmissionDate >= m.AdmissionDate
                 order by m.AdmissionDate desc
                ) as m
order by v.MRN
        ,v.AdmissionDate;

Вывод

+-----+---------------+---------------+
| MRN | AdmissionDate | AdmissionDate |
+-----+---------------+---------------+
|   1 | 2019-01-02    | 2019-01-01    |
|   1 | 2019-01-06    | 2019-01-05    |
|   2 | 2019-01-04    | 2019-01-02    |
|   3 | 2019-01-01    | NULL          |
+-----+---------------+---------------+
14
задан Joachim Sauer 8 August 2011 в 07:19
поделиться

5 ответов

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

Интерфейсы не могут содержать также.

20
ответ дан 1 December 2019 в 07:52
поделиться

Да, существует место и для абстрактных классов и для интерфейсов.

Давайте пойдем с конкретным примером. Мы изучим, как сделать a CheckingAccount и SavingsAccount из краткого обзора AbstractBankAccount и посмотрите, как мы можем использовать интерфейс, дифференцируют два типа учетных записей.

Для начинаний вот, абстрактный класс AbstractBankAccount:

abstract class AbstractBankAccount
{
    int balance;
    public abstract void deposit(int amount);
    public abstract void withdraw(int amount);
}

У нас есть остаток на счете как balance и два метода deposit и withdraw это должно быть реализовано подклассами.

Как мы видим, абстрактный класс объявляет структуру того, как должны быть определены банковские счета. Как @Uri упоминания в его ответе, существует состояние к этому абстрактному классу, который является balance поле. Это не было бы возможно с интерфейсом.

Теперь, давайте разделим на подклассы AbstractBankAccount сделать a CheckingAccount

class CheckingAccount extends AbstractBankAccount
{
    public void deposit(int amount)
    {
        balance += amount;
    }

    public void withdraw(int amount)
    {
        balance -= amount;
    }
}

В этом подклассе CheckingAccount, мы реализовали эти два абстрактных класса - ничто слишком интересное здесь.

Теперь, как мы могли реализовать SavingsAccount? Это отличается от a CheckingAccount в этом это получит интерес. Интерес мог быть увеличен при помощи deposit метод, но с другой стороны, это не, как будто клиентка вносит интерес сама. Поэтому могло бы быть более более ясно, было ли у нас другое средство добавляющих денег в учетную запись, специально для интереса, скажем, accrueInterest метод.

Мы могли непосредственно реализовать метод в SavingsAccount, но у нас может быть больше типов банковского счета, которые могут накопить проценты в будущем, таким образом, мы можем хотеть сделать InterestBearing интерфейс, который имеет accrueInterest метод:

interface InterestBearing
{
    public void accrueInterest(int amount);
}

Так, мы теперь можем сделать SavingsAccount класс, который может получить интерес путем реализации InterestBearing интерфейс:

class SavingsAccount extends AbstractBankAccount implements InterestBearing
{
    public void deposit(int amount)
    {
        balance += amount;
    }

    public void withdraw(int amount)
    {
        balance -= amount;
    }

    public void accrueInterest(int amount)
    {
        balance += amount;
    }
}

Теперь, если мы хотим сделать другой тип учетной записи, сказать a PremiumSavingsAccount, мы можем сделать подкласс AbstractBankAccount и реализация InterestBearing интерфейс для создания другой приносящей проценты учетной записи.

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

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

8
ответ дан 1 December 2019 в 07:52
поделиться

Абстрактный класс v/s интерфейс является одной темой, которая генерирует партию любопытства/интереса/беспорядка для любого плохо знакомого с Java и хочет вырыть глубже.

Эта статья дает подробное объяснение по теме.

4
ответ дан 1 December 2019 в 07:52
поделиться

Там несколько причин, почему Вы могли бы предпочесть абстрактный класс без реализаций по интерфейсу:

  • Определенные невозможные броски и instanceof операции могут быть пойманы во время компиляции.
  • У Вас действительно есть опция добавления конкретных методов в более поздней версии.
  • Много лет назад раньше был значительный выигрыш в производительности.
  • С очень неясной точки зрения безопасности Вы не можете заставить существующий ранее класс реализовывать методы путем создания подкласса существующего ранее класса и абстрактного класса.

Но с другой стороны, ключевое слово интерфейса Java позволяет более чистый источник.

2
ответ дан 1 December 2019 в 07:52
поделиться

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

При помощи интерфейсов в Вашем API это становится легче для людей (включая Вас) к коду теста записи против Ваших классов, так как можно использовать тестовые классы, которые, например, не зависят ни от каких внешних ресурсов, или которые показывают явные виды bad-but-difficult-to-simulate-in-real-life поведения.

Таким образом, Java обеспечивает интерфейс List, и абстрактный базовый класс AbstractList для "уменьшения усилия должен был реализовать" интерфейс...

0
ответ дан 1 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

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