Интерфейсный или абстрактный класс?

В следующем коде. У меня есть

1. Получил метку времени из строки даты.

2. И разобрал его в Int

3. Наконец создал Date, используя его.

var dateString = "/Date(1224043200000)/";
var seconds = parseInt(dateString.replace(/\/Date\(([0-9]+)[^+]\//i, "$1"));
var date = new Date(seconds);
console.log(date);
13
задан Appulus 7 November 2013 в 12:14
поделиться

10 ответов

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

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

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

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

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

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

16
ответ дан 1 December 2019 в 17:29
поделиться

Обратите внимание, что вы не можете переопределить операторы в интерфейсах. Насколько я понимаю, это единственная реальная проблема с ними.

0
ответ дан 1 December 2019 в 17:29
поделиться

Если у вас есть функция в классе, вы должны использовать класс abstact вместо интерфейса. Как правило, интерфейс используется от имени типа.

0
ответ дан 1 December 2019 в 17:29
поделиться

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

0
ответ дан 1 December 2019 в 17:29
поделиться

При прочих равных, используйте интерфейс. Легче имитировать модульное тестирование.

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

1
ответ дан 1 December 2019 в 17:29
поделиться

Я бы предпочел базовый абстрактный класс, потому что теоретически (ну, это всего лишь одна теория, я не доказываю и не говорю, что какая-то другая хуже этой) - интерфейсы должны быть используется, когда вы хотите показать, что какой-то объект способен что-то делать (например, IComparable - вы показываете, что все, что его реализует, можно сравнить с чем-то другим), тогда как когда у вас есть 2 экземпляра, которые просто имеют что-то общее или имеют 1 логический parent - следует использовать абстрактные классы.
Вы также можете использовать оба подхода, используя базовый класс, который будет реализовывать интерфейс, который будет явно указывать на то, что может делать ваш класс.

1
ответ дан 1 December 2019 в 17:29
поделиться

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

Например, IXmlSerializable не является «сущностью» сам по себе. Он определяет контракт, который может реализовать организация. Интерфейсы живут «вне» иерархии наследования.

5
ответ дан 1 December 2019 в 17:29
поделиться

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

Базовый класс предлагает возможность построить «дерево» наследования, в котором более сложные классы (общего типа ') построены на основе более простых «базовых» классов. Классическим и раздражающим примером в объектно-ориентированном стиле обычно является базовый класс 'Shape', который наследуется от Triangle, Square и т. Д.

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

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

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

1
ответ дан 1 December 2019 в 17:29
поделиться

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

Я бы не стал привлекать IXmlSerializable , если только мне не пришлось; это запутанный, хитрый интерфейс, который часто становится причиной беды.

Каковы именно ваши требования к сериализации? Могут быть варианты получше ... однако для многих сериализаторов базовый класс будет проще, чем интерфейс. Например, для XmlSerializer вы можете иметь:

[XmlInclude(typeof(MyObject))] // : ObjectBase 
[XmlInclude(typeof(MyObjectGroup))] // : ObjectBase 
public abstract class ObjectBase { /*  */ }

(точный подход зависит от сериализатора)

7
ответ дан 1 December 2019 в 17:29
поделиться
Другие вопросы по тегам:

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