javascript TypeScript中的C#类虚拟成员的等价物

eiee3dmh  于 2023-03-28  发布在  Java
关注(0)|答案(5)|浏览(319)

因此,在C#中,当我创建模型类和延迟加载时,我会这样做:

public int? User_ID { get; set; }
public int? Dept_ID { get; set; }

然后在我的班级里,我像这样弹出我的虚拟机:

public virtual User User {get; set;}
public virtual Department Dept {get; set;}

在Typescript中我该怎么做呢?类似这样的东西?:

User_ID: number;
Dept_ID: number;
User: User;
Dept: Department;

我不认为接口是我想要的/需要的......但是保护似乎也不正确。有些东西告诉我,我在这里错过了一个明显的答案。

lxkprmvk

lxkprmvk1#

以下内容同样适用于TypeScript和JavaScript:
没有对等的。
JavaScript中的每一个成员访问都是动态分派的,这是因为JavaScript中的成员访问本质上是在哈希表中查找键。
一个对象可以声明一个成员,它通过原型链继承了一个相同的键,从而 * 影子 * 继承的成员,但这与虚拟性不同,虚拟性是语言中不存在的概念。

ui7jx7zq

ui7jx7zq2#

是的有。

//non-abstract or abstract class
class A {
    
    // The virtual method
    protected virtualStuff1?():void;

    public Stuff2(){
        //Calling overridden child method by parent if implemented
        this.virtualStuff1 && this.virtualStuff1();
        alert("Baseclass Stuff2");
    }
}

//class B implementing virtual method
class B extends A{
    
    // overriding virtual method
    public virtualStuff1()
    {
        alert("Class B virtualStuff1");
    }
}

//Class C not implementing virtual method
class C extends A{
 
}

var b1 = new B();
var c1= new C();
b1.Stuff2();
b1.virtualStuff1();
c1.Stuff2();
ajsxfq5m

ajsxfq5m3#

Javascript和Typescript中的所有方法在技术上都是虚拟的,因为没有什么可以阻止你重写任何方法。

olmpazwi

olmpazwi4#

我使用箭头函数作为类的属性来实现这一点(注意这是在ts中,但如果你对现代js很熟悉,它应该可以工作):

class baseClass {
    doSomething = () => {};
}

class derivedClass extends baseClass {
    constructor() {
        this.doSomeThing = () => { console.log('something'); };
    }
}
kxe2p93d

kxe2p93d5#

如果你想定义一个函数而不给它赋值,你可以使用?字符。

class MyAbstract {
 myMethod?(arg: string): void;
}

class MyImpl {
 myMethod(arg: string): void { .... }
}

但是,当访问声明为MyAbstract的示例时,调用myMethod将始终引发Cannot invoke an object which is possibly 'undefined'.ts(2722),因此您必须使用!字符来指定您确定它已实现。

let inst: MyAbstract;
// ...
inst.myMethod!('blah');

相关问题