2017-02-11 6 views
1

У меня очень сложное время для написания модулей, которые состоят обычно из 3-5 небольших модулей или классов. Проблема возникает, когда эти вспомогательные компоненты необходимо расширить, но основной модуль уже создает и реализует свои базовые версии.ООП для многокомпонентных классов

Пример

// main module design 

class Car { 
    constructor() { 
    this.horn = new Horn(); 
    this.horn.on('honk', function() { 
     console.log('honked'); 
    }) 
    } 
} 

class Horn { 
    constructor() { 
    this.sound = 'hornA.wav' 
    } 
} 

// extended module design 

class RaceCar extends Car { 
    constructor() { 
    super(); 
    this.horn = new RaceHorn(); 

    // event handler is now missing 
    } 
} 

class RaceHorn extends Horn { 
    constructor() { 
    super(); 
    this.horn = 'hornB.wav' 
    } 
} 

Это действительно очень упрощенный пример, в то время как мои истинные вопросы включают модули с большим количеством компонентов и более требований установки. Я понимаю, что могу поместить вещи в другую init или setup или аналогичную функцию, но мне кажется, что я делаю что-то неправильно по своей сути.

+1

Вы не должны использовать наследование как среднее для настройки. RaceCar действительно должен быть экземпляром Car, сконфигурированным с другим рогом, и все это делается на заводе. – plalx

+0

Вам, вероятно, даже не нужны разные рожки, просто дайте ему параметр для воспроизведения звукового файла. – Bergi

ответ

1

Я предлагаю передать значения через параметры, что касается этой проблемы. Параметры по умолчанию может помочь много

// main module design 

class Car { 
    constructor(parametrizedHorn=Horn) { 
    this.horn = new parametrizedHorn(); 
    this.horn.on('honk', function() { 
     console.log('honked'); 
    }) 
    } 
} 

class Horn { 
    constructor() { 
    this.sound = 'hornA.wav' 
    } 
} 

// extended module design 

class RaceCar extends Car { 
    constructor() { 
    super(RaceHorn); 
    } 
} 

class RaceHorn extends Horn { 
    constructor() { 
    super(); 
    this.sound = 'hornB.wav' 
    } 
} 

Это может получить очень грязно, так что вместо этого вы можете использовать методы инициализации

// main module design 

class Car { 
    constructor() { ... } 
    init(hornType=Horn){ 
    this.initHorn(hornType); 
    } 
    initHorn(hornType=Horn){ 
    this.horn = new Horn(); 
    this.horn.on('honk', function() { 
     console.log('honked'); 
    }) 
    } 
} 

class Horn { 
    constructor() { 
    this.sound = 'hornA.wav' 
    } 
} 

// extended module design 

class RaceCar extends Car { 
    constructor() { 
    super(); 
    } 
    init(hornType=RaceHorn){ 
    this.initHorn(hornType); 
    } 
} 

class RaceHorn extends Horn { 
    constructor() { 
    super(); 
    this.sound = 'hornB.wav' 
    } 
} 

const raceCar = new RaceCar(); 
raceCar.init(); 

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

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

  • Нет связанных вопросов^_^