TypeScript 中 C# 类虚拟成员的等效项

问题描述 投票:0回答:4

因此,在 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;

我不认为接口是我想要/需要的......但话又说回来,受保护似乎也不正确。有些东西告诉我我在这里缺少一个明显的答案。

javascript c# typescript oop overriding
4个回答
28
投票

以下内容同样适用于 TypeScript 和 JavaScript:

没有同等的。

根据定义,JavaScript 中的每个成员访问都受动态调度的约束。这是因为 JavaScript 中的成员访问从道德上讲是哈希表中的键查找。

一个对象可以声明一个与它通过原型链继承的成员具有相同键的成员,从而shadow继承的成员,但这与虚拟性不同,虚拟性是语言中不存在的概念。


请注意,C# 有一个类似的概念,称为隐藏,它可用于静态隐藏继承的成员而不覆盖它。然而,这在很大程度上是不同的,它的存在是为了满足 C# 运行时影响和完全具体化的类型系统的需求。


15
投票

是的,有..

//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();

3
投票

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


-1
投票

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

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

class derivedClass extends baseClass {
    constructor() {
        this.doSomeThing = () => { console.log('something'); };
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.