Альтернатива для Множественного наследования в Java

IE8 не поддерживает метод freeze ().
Источник: http://kangax.github.io/compat-table/es5/ , нажмите "Показать устаревшие браузеры?" сверху и проверьте IE8 & amp; пересечение строк замораживания строк.

В моем текущем игровом проекте я использовал ниже, так как мало клиентов все еще используют IE8:

var CONST_WILD_TYPES = {
    REGULAR: 'REGULAR',
    EXPANDING: 'EXPANDING',
    STICKY: 'STICKY',
    SHIFTING: 'SHIFTING'
};

Мы могли бы также сделать:

var CONST_WILD_TYPES = {
    REGULAR: 'RE',
    EXPANDING: 'EX',
    STICKY: 'ST',
    SHIFTING: 'SH'
};

или даже это:

var CONST_WILD_TYPES = {
    REGULAR: '1',
    EXPANDING: '2',
    STICKY: '3',
    SHIFTING: '4'
};

Последнее, кажется, наиболее эффективно для строки, оно уменьшает вашу общую пропускную способность, если у вас есть сервер & amp; клиент обменивается этими данными.
Конечно, теперь вы обязаны убедиться, что в данных нет конфликтов (RE, EX и т. Д. Должны быть уникальными, а также 1, 2 и т. Д. Должны быть уникальными). Обратите внимание, что вы должны поддерживать их всегда для обратной совместимости.

Назначение:

var wildType = CONST_WILD_TYPES.REGULAR;

Сравнение:

if (wildType === CONST_WILD_TYPES.REGULAR) {
    // do something here
}

9
задан dfa 24 June 2009 в 13:32
поделиться

7 ответов

Просто чтобы прояснить мой комментарий.

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

    interface InfoMessAware {

         String getMessage();
    }

    interface BackPageAware {

         String getBackPage();
    }

class DefaultInfoMessAware {
         String getMessage() {
             return "message";
         }
}

class DefaultBackPageAware {
         String getBackPage() {
             return "backPage";
         }
}

    class MyBean implements InfoMessAware, BackPageAware {
         private InfoMessAware messAware = new DefaultInfoMessAware();
         private BackPageAware backPageAware = new DefaultBackPageAware();

         String getMessage() {
             return messAware.getMessage();
         }

         String getBackPage() {
             return backPageAware.getBackPage();
         }
    }
10
ответ дан 4 December 2019 в 07:14
поделиться

используйте интерфейсы:

interface InfoMessAware {

     String getMessage();
}

interface BackPageAware {

     String getBackPage();
}

class MyBean implements InfoMessAware, BackPageAware {

     String getMessage() {
         return "message";
     }

     String getBackPage() {
         return "backPage";
     }
}

затем замените instanceof стандартным методом звонки.

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

Проблема, которую вы описываете, требует использования композиции, а не наследования. Класс BackPageAware означает, что он знает об этом классе / функциональности. Наследование означает, что это IS BackPage. Вы описали связь ИМЕЕТ .

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

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

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

public interface BackPageBean {
   public String getBackPage();
}


public interface InformationMessageBean {
   public String getInformationMessage();   
}

Если вы хотите, чтобы класс реализовывал как BackPageBean, так и InformationMessageBean, вы просто делаете это:

public MyBean implements BackPageBean, InformationMessageBean {

  public String getBackPage() {
    return null;
  }

  public String getInformationMessage() {
    return null;
  }
}

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

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

Объявите BackPageAware и InformationAware как интерфейсы, создайте абстрактные классы, реализующие эти интерфейсы для обеспечения функциональности по умолчанию. Любой класс, который должен быть только одним из двух интерфейсов, может наследовать соответствующий абстрактный класс. Класс, который должен быть обоими, может наследовать один из абстрактных классов и реализовать другой интерфейс или реализовать оба интерфейса, что угодно. Если нет функциональности по умолчанию, вам даже не нужны абстрактные классы.

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

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

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

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

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

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