oop - 我可以在继承类上获取父类名称(第一个)吗?

标签 oop inheritance haxe

例如,我有三个类: View 、 FView ( extends View ) 和 MView (extends View) 。我有来自 MView 类型的变量,并想根据父类 View 来检查它(即,如果这个变量来自类 View )。是否可以获取父类(View 类)? .这是完整的示例:https://try.haxe.org/#eA594

class Test {
    static function main() {
        var v = new SView();
        trace(Type.getClassName( Type.getSuperClass(Type.getClass(v))) );
    }
}

类 View :
class View {
    public function new() {

    }
}

FView 类:
class FView  extends View { 
    public function new() {
        super();
    }
}

类 SView :
class SView  extends FView {
    public function new() {
        super();
    }
}

最佳答案

如果你想进入基类,你可以简单地递归或迭代直到 Type.getSuperClass()返回 null :

// at runtime: find out what is the base class of `v`
var base:Class<Dynamic> = Type.getClass(v);
while (true) {
    var s = Type.getSuperClass(base);
    if (s == null)
        break;
    base = s;
}
trace(Type.getClassName(base));

但是,您提到您想这样做只是为了检查 MView (或 SView )属于 View类型。

好吧,为此,有一些更简单的选择......

首先,在编译类型,您可以简单地使用 type check (或作业)检查是否 v:SView unifiesView :
// at compile time: enforce that `v` be of type `View` or compatible with it
var v1 = (v:View);  // use a type check
var v2:View = v;    // or simply pass it to something expecting `View`

如果您需要在运行时执行此操作,也可以使用 Std.is() :
// at runtime: check if `v` is a subclass instance of `View`
trace(Std.is(v, View));

有关完整示例,请查看 this尝试 Haxe 实例。

关于oop - 我可以在继承类上获取父类名称(第一个)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46551024/

相关文章:

macros - 在 Haxe 编译期间访问编译日期

haxe - 如何通过 XML(?) 在 OpenFL (Haxe) 中导出(保存)数据

generics - 在 Haxe 3 中正确调用泛型函数

oop - 插件系统背后的逻辑?

c++ - 带有 2 个列表的面向对象

c# - 实现定义基类属性的接口(interface)时,为什么实现接口(interface)的类不能返回派生类类型的对象?

inheritance - 如何在 TypeScript 的派生类中重载构造函数?

php - 从 PHP 类中的数据库中获取数据

javascript - JavaScript 有类吗?

javascript - 用原型(prototype)继承覆盖方法