Реализация Серхио Карнейро и Джона требует определения функции инициализации для всех, кроме одного класса. Вот модифицированная версия функции агрегации, которая вместо этого использует конструкторы по умолчанию.
var aggregation = (baseClass, ...mixins) => {
class base extends baseClass {
constructor (...args) {
super(...args);
mixins.forEach((mixin) => {
copyProps(this,(new mixin));
});
}
}
let copyProps = (target, source) => { // this function copies all properties and symbols, filtering out some special ones
Object.getOwnPropertyNames(source)
.concat(Object.getOwnPropertySymbols(source))
.forEach((prop) => {
if (!prop.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/))
Object.defineProperty(target, prop, Object.getOwnPropertyDescriptor(source, prop));
})
}
mixins.forEach((mixin) => { // outside contructor() to allow aggregation(A,B,C).staticFunction() to be called etc.
copyProps(base.prototype, mixin.prototype);
copyProps(base, mixin);
});
return base;
}
Вот небольшая демонстрация:
class Person{
constructor(n){
this.name=n;
}
}
class Male{
constructor(s='male'){
this.sex=s;
}
}
class Child{
constructor(a=12){
this.age=a;
}
tellAge(){console.log(this.name+' is '+this.age+' years old.');}
}
class Boy extends aggregation(Person,Male,Child){}
var m = new Boy('Mike');
m.tellAge(); // Mike is 12 years old.
Эта функция агрегации будет предпочитать свойства и методы класса, которые появляются позже в Список классов.
System.Diagnostics.Process.Start("http://www.webpage.com");
Один из многих путей.
Я использовал эту строку для запуска браузера по умолчанию:
System.Diagnostics.Process.Start("http://www.google.com");
Принятый ответ больше не работает над .NET Core 3 . Чтобы заставить его работать, используйте следующий метод:
var psi = new ProcessStartInfo
{
FileName = url,
UseShellExecute = true
};
Process.Start (psi);