有一个在类型记录/JavaScript (Script4J)中实现Java(FX) API的项目。现在我要修改比较器的功能接口。这是默认解决方案:
export interface Comparator<T> {
(o1: T, o2: T): number;
}这种解决方案允许将比较器添加为箭头函数(如java lambda),例如:
let comparator: Comparator<number> = (n1: number, n2: number): number => {
return n1 - n2;
};
let treeMap: SortedMap<number, string> = new TreeMap<number, string>(comparator);正如您所看到的,代码非常干净。现在,我需要添加到TypeScript比较器接口下一个方法(Java代码):
default Comparator<T> reversed() {
return Collections.reverseOrder(this);
}考虑到我不能更改API,什么是最好的方法?
发布于 2019-04-21 16:38:03
经过一些思考,我决定实现最大Java的唯一方法是使用抽象类而不是接口。这是我的解决办法:
function applyMixins(derivedCtor: any, baseCtors: any[]) {
baseCtors.forEach(baseCtor => {
Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {
if (name !== 'constructor') {
derivedCtor.prototype[name] = baseCtor.prototype[name];
}
});
});
}
type ComparatorFunc<T> = (o1: T, o2: T) => any;
abstract class Comparator<T> {
public static lambda<T>(func: ComparatorFunc<T>): Comparator<T> {
return new class extends Comparator<T> {
public compare(o1: T, o2: T): number {
return func(o1, o2);
}
}
}
public abstract compare(o1: T, o2: T): number;
}
//VAR 1 - lambda
let lambdaComparator: Comparator<number> = Comparator.lambda((n1: number, n2: number) => { return n1 - n2;});
console.log("Lambda comparator");
console.log(lambdaComparator.compare(100, 50));
//VAR 2 - full implementation
class MyComparator implements Comparator<number> {
public compare(o1: number, o2: number): number {
return o1 - o2;
}
}
applyMixins (MyComparator, [Comparator]);
let classComparator: MyComparator = new MyComparator();
console.log("Class comparator");
console.log(classComparator.compare(100, 50));优势:
缺点:
发布于 2019-04-21 10:41:03
在类型记录中没有与默认接口方法实现直接等效的方法。您可以使用ea函数将默认值分配给比较器函数:
export interface Comparator<T> {
(o1: T, o2: T): number;
reversed() : any // not sure what return type should be, maybe (o1: T, o2: T) => number ?
}
function comparatorWithDefault<T>(fn: (o1: T, o2: T) => number) {
function reversed(this: Comparator<T>) {
return Collections.reverseOrder(this);
}
return Object.assign(fn, { reversed });
}
let comparator: Comparator<number> = comparatorWithDefault((n1: number, n2: number): number => {
return n1 - n2;
})
let treeMap: SortedMap<number, string> = new TreeMap<number, string>(comparator);与Java不同,将成员添加到Comparator将破坏许多现有代码。
https://stackoverflow.com/questions/55781400
复制相似问题