Когда использовать абстрактный класс или интерфейс? [закрытый]

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

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

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

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

28
задан JavaResp 11 November 2011 в 22:40
поделиться

6 ответов

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

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

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

- EDIT - забыл упомянуть, Эрвикер напомнил мне

. Наконец, вы можете реализовать столько интерфейсов, сколько захотите, но расширять только один класс (абстрактный или нет). Помните об этом перед выбором.

41
ответ дан 28 November 2019 в 02:36
поделиться

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

17
ответ дан 28 November 2019 в 02:36
поделиться

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

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

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

Хорошим примером является каркас коллекций библиотеки классов Java. У вас есть интерфейс List, который определяет, как списки должны себя вести. Некоторые реализации, например, ArrayList и LinkedList. Поскольку они ведут себя одинаково, вещи, которые работают одинаково для обоих, реализованы в абстрактном классе AbstactList, оба наследуют это.

12
ответ дан 28 November 2019 в 02:36
поделиться

Абстрактные классы используются, когда вы построение иерархии наследования. Однако большинство иерархий наследования не должно быть слишком «глубоким» (т.е. слишком много уровней наследования). Многие книги по объектно-ориентированному дизайну отдают предпочтение интерфейсам, а не наследованию (в одной книге, которую я прочитал, как-то процитировал разработчика, что «наследование - это самая крутая [объектно-ориентированная] функция, которую вы не реализуете»), поскольку это позволяет классам назначать поведение » по контракту ", где контракт - это интерфейс.

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

Надеюсь, это поможет!

1
ответ дан 28 November 2019 в 02:36
поделиться

SamuelCarrijo , похоже, хорошо ответил на этот вопрос

В дополнение к Java, некоторым фреймворкам требуется интерфейс для работы. Я думаю о (скажем) динамических прокси или некоторых фреймворках проксирования клиент / сервер. Это потому, что они используют интроспекцию объекта, чтобы определить методы, реализованные интерфейсами, реализованными объектом. Так что иногда вам нужно реализовать интерфейс для объекта, где, возможно, вы обычно не беспокоитесь.

Обратите внимание, эта причина интерфейсов специфична для Java.

2
ответ дан 28 November 2019 в 02:36
поделиться

См. Интерфейс - это в основном «Контракт». Когда вы определяете интерфейс, вы определяете контракт. Если абстрактные классы расширены, интерфейсы реализуются.

Давайте рассмотрим пример.

public interface Friend {
void hello();
}

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

Вот реализация:

public class myFriend implements Friend {
public void hello()
println("Done");
}

Теперь myFriend выполнил контракт. Теперь вопрос: где следует использовать интерфейсы?

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

Реализованы интерфейсы.

Давайте рассмотрим пример.

public interface Friend {
void hello();
}

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

Вот реализация:

public class myFriend implements Friend {
public void hello()
println("Done");
}

Теперь myFriend выполнил контракт. Теперь вопрос: где следует использовать интерфейсы?

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

Реализованы интерфейсы.

Давайте рассмотрим пример.

public interface Friend {
void hello();
}

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

Вот реализация:

public class myFriend implements Friend {
public void hello()
println("Done");
}

Теперь myFriend выполнил контракт. Теперь вопрос: где следует использовать интерфейсы?

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

public interface Friend {
void hello();
}

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

Вот реализация:

public class myFriend implements Friend {
public void hello()
println("Done");
}

Теперь myFriend выполнил контракт. Теперь вопрос: где следует использовать интерфейсы?

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

public interface Friend {
void hello();
}

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

Вот реализация:

public class myFriend implements Friend {
public void hello()
println("Done");
}

Теперь myFriend выполнил контракт. Теперь вопрос: где следует использовать интерфейсы?

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

Где следует использовать интерфейсы?

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

Где следует использовать интерфейсы?

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

4
ответ дан 28 November 2019 в 02:36
поделиться
Другие вопросы по тегам:

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