2016-01-29 5 views
1

Я хотел бы создать абстрактный класс в javascript, который реализует определенные методы, вызывает абстрактные и позволяет «унаследованным» классам реализовать эти абстрактные. Я много читал о прототипах js. Каждая предлагаемая реализация абстрактных классов и методов в javascript представляется простым наследованием, но не реальной абстракцией. Вот очень простой пример, чтобы показать, что я хочу добиться:Реальный абстрактный метод в javascript

var abstractClass = { 
 
     abstractMethod: function() { /* i don't know yet what i'm going to do */ }, 
 
     concreteMethod: function() { 
 
     abstractClass.abstractMethod(); 
 
     } 
 
    } 
 

 

 
    specializedClass = Object.create(abstractClass); 
 
    specializedClass.abstractMethod = function() { 
 
     alert('Now i know what to do'); 
 
    } 
 

 
    specializedClass.concreteMethod();

Мой вопрос: есть ли не-Hacky, не обходной путь, чтобы сделать абстрактные классы в JavaScript?

+0

Это экземпляры, а не классы. – SLaks

+0

Я бы не пытался превратить JavaScript в классический язык. На самом деле нет такой вещи, как класс в js, хотя у нас есть ключевое слово class в ES6/2015, это всего лишь синтаксический сахар. Проверьте это: https://medium.com/javascript-scene/the-heart-soul-of-prototypal-oo-concatenative-inheritance-a3b64cb27819#.fg58xcejw – Rupert

+0

Я действительно не хочу строить наследование классов, я просто хотите сделать какой-то тайм-сервис, который обрабатывает интервал start/stop, а пользовательские классы просто должны реализовать действие по тикам – kexx

ответ

1

внутри методов используйте этот вместо названного класса/переменной, который дублируется/разбивается на вызов Object.create().

var abstractClass = { 
    abstractMethod: function() { /* i don't know yet what i'm going to do */ }, 
    concreteMethod: function() { 
    this.abstractMethod(); // < made generic with this 
    } 
} 


specializedClass = Object.create(abstractClass); 
specializedClass.abstractMethod = function() { 
    alert('Now i know what to do'); 
} 

specializedClass.concreteMethod(); 
+0

В чем смысл сохранения «абстрактного» 'abstractMethod'? – Amit

+0

@Amit: внесение минимальной модификации кода OP, чтобы заставить его работать ... – dandavis

+0

То же самое, когда вы используете абстрактные методы на реальном языке oop: вы можете вызвать его в базовом классе. Возможно, в случае js это не требуется, но я положил его туда для примера – kexx

Смежные вопросы