假设我有这两个子类:
Male.js
var Person = require('./Person.js');
class Male extends Person {
...
}
module.exports = Male;
Female.js
var Person = require('./Person.js');
class Female extends Person {
...
}
module.exports = Female;
最后我有了这个基类:
Person.js
class Person {
static makePersonBySettings(settings) {
var person;
if(settings.gender == 'male') {
person = new Male(settings.name);
}
else if(settings.gender == 'female') {
person = new Female(settings.name);
}
return person;
}
}
module.exports = Person;
Parent的静态方法取决于知道男性和女性的课程。我不能在Person.js的顶部做require('./Male.js');
,因为男性依赖于人。
Objective-C,Java等允许您在编译器解决问题时执行此操作。
使用Node JS解决此问题的最佳方法是什么?
答案 0 :(得分:3)
最好使用Factory pattern,如下所示:
function Maternity{
this.giveBirthTo = function(settings){
var person;
if(settings.gender == 'male') {
person = new Male(settings.name);
}
else if(settings.gender == 'female') {
person = new Female(settings.name);
}
return person;
}
}
然后,在代码中:
var factory = new Maternity();
var john = factory.giveBirthTo({name: 'John', gender:'male'});
答案 1 :(得分:0)
如果我理解正确,makePersonBySettings()
是一个允许用户创建Male
Female
实例而无法直接访问这些类的函数。我想你想把男性,女性和个人分开存放。这在Node中有点不寻常。但是,如果您想要遵循此模式,则可以执行以下操作:
定义您的Person类,但暂时忽略makePersonBySettings()
。
// person-base.js
'use strict';
class Person { ... }
module.exports = Person;
定义你的男女班级;需要人员在每个人的顶部。
// female.js
'use strict';
var Person = require('./person-base');
class Female extends Person { ... }
module.exports = Female;
在单独的文件中,需要您的Male,Female和Person文件,现在添加静态方法,如下所示:
// person.js
'use strict';
var Person = require('./person-base');
var Male = require('./male');
var Female = require('./female');
Person.makePersonBySettings = function() {
// You can reference Male and Female here.
};
module.exports = Person;
现在,只要您需要,就可以require('./person.js')
。
我认为,你会更好地考虑@TudorConstantin提到的工厂模式,除非出于某种原因完全不在桌面上。