В следующем коде. У меня есть
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);
В общем, подход, который я использую в такой ситуации, заключается в имеют как интерфейс, так и абстрактный класс. Интерфейсы определяют, ну, интерфейс. Абстрактный класс - это просто помощник.
Вы действительно не ошибетесь с этим подходом. Интерфейсы дают вам возможность изменять реализацию. Абстрактные классы предоставляют вам шаблонный и вспомогательный код, который вы не обязаны использовать, как в противном случае, если бы ваши методы были явно определены в терминах абстрактного класса.
подход, который я использую в подобной ситуации, заключается в наличии и интерфейса, и абстрактного класса. Интерфейсы определяют, ну, интерфейс. Абстрактный класс - это просто помощник.Вы действительно не ошибетесь с этим подходом. Интерфейсы дают вам возможность изменять реализацию. Абстрактные классы предоставляют вам шаблонный и вспомогательный код, который вы не обязаны использовать, как в противном случае, если бы ваши методы были явно определены в терминах абстрактного класса.
подход, который я использую в подобной ситуации, заключается в наличии и интерфейса, и абстрактного класса. Интерфейсы определяют, ну, интерфейс. Абстрактный класс - это просто помощник.Вы действительно не ошибетесь с этим подходом. Интерфейсы дают вам возможность изменять реализацию. Абстрактные классы предоставляют вам шаблонный и вспомогательный код, который вы не обязаны использовать, как в противном случае, если бы ваши методы были явно определены в терминах абстрактного класса.
Обратите внимание, что вы не можете переопределить операторы в интерфейсах. Насколько я понимаю, это единственная реальная проблема с ними.
Если у вас есть функция в классе, вы должны использовать класс abstact вместо интерфейса. Как правило, интерфейс используется от имени типа.
Я использовал абстрактные классы в своих проектах, но в будущих проектах я буду использовать интерфейсы. Преимущество «множественного наследования» чрезвычайно полезно. Всегда приветствуется возможность предоставить совершенно новую реализацию класса как в коде, так и в целях тестирования. Наконец, если в будущем вы захотите иметь возможность настраивать свой код внешними разработчиками, вам не нужно предоставлять им свой настоящий код - они могут просто использовать интерфейсы ...
При прочих равных, используйте интерфейс. Легче имитировать модульное тестирование.
Но обычно все, что я использую для базовых классов, - это когда есть какой-то общий код, который я бы предпочел поместить в одно место, а не каждый экземпляр производного класса. Если это для чего-то вроде того, что вы описываете, где они используются одинаково, но их основная механика отличается, интерфейс звучит более подходящим.
Я бы предпочел базовый абстрактный класс, потому что теоретически (ну, это всего лишь одна теория, я не доказываю и не говорю, что какая-то другая хуже этой) - интерфейсы должны быть используется, когда вы хотите показать, что какой-то объект способен что-то делать (например, IComparable - вы показываете, что все, что его реализует, можно сравнить с чем-то другим), тогда как когда у вас есть 2 экземпляра, которые просто имеют что-то общее или имеют 1 логический parent - следует использовать абстрактные классы.
Вы также можете использовать оба подхода, используя базовый класс, который будет реализовывать интерфейс, который будет явно указывать на то, что может делать ваш класс.
Как правило, вы должны рассматривать интерфейсы как контракты , которые реализуют некоторые типы, а абстрактные классы как узлы в иерархии наследования , которые не существуют сами по себе ( т.е. между производным классом и базовым абстрактным классом существует связь "является" ). Однако на практике вам может потребоваться использовать интерфейсы в других случаях, например, когда вам нужно множественное наследование.
Например, IXmlSerializable
не является «сущностью» сам по себе. Он определяет контракт, который может реализовать организация. Интерфейсы живут «вне» иерархии наследования.
Интерфейс позволит вам определить «контракт», который объект должен будет выполнить, предоставив свойства и методы, как описано в интерфейсе. Вы можете ссылаться на объекты с помощью переменных типа интерфейса, что может вызвать некоторую путаницу в отношении того, что именно предлагается.
Базовый класс предлагает возможность построить «дерево» наследования, в котором более сложные классы (общего типа ') построены на основе более простых «базовых» классов. Классическим и раздражающим примером в объектно-ориентированном стиле обычно является базовый класс 'Shape', который наследуется от Triangle, Square и т. Д.
Суть в том, что с интерфейсом вам необходимо предоставить весь контракт с каждым классом, который реализует Это,
Вы действительно можете пойти с ОБАИМИ. ObjectBase избавляет вас от необходимости более одного раза реализовывать общие свойства и реализует IObject за вас. Везде, где вы его используете, обращайтесь к IObject, чтобы вы могли позже провести тестирование с помощью моков
Интерфейс будет моим по умолчанию, пока не появится причина для использования базового класса, поскольку он принимает меньше решений за нас.
Я бы не стал привлекать IXmlSerializable
, если только мне не пришлось; это запутанный, хитрый интерфейс, который часто становится причиной беды.
Каковы именно ваши требования к сериализации? Могут быть варианты получше ... однако для многих сериализаторов базовый класс будет проще, чем интерфейс. Например, для XmlSerializer
вы можете иметь:
[XmlInclude(typeof(MyObject))] // : ObjectBase
[XmlInclude(typeof(MyObjectGroup))] // : ObjectBase
public abstract class ObjectBase { /* */ }
(точный подход зависит от сериализатора)