【问题标题】:Is there a way to declare classes and methods as abstract in Haxe?有没有办法在 Haxe 中将类和方法声明为抽象?
【发布时间】:2015-05-21 14:53:19
【问题描述】:

在 Haxe 中有没有办法获得 Java 的抽象方法和抽象类的等价物?

我想要的是

// An abstract class.  (Written in a Java/Haxe hybrid.)
abstract class Process<A> {
    public function then<B>( f : A -> Process<B> ) : Process<B> {
        var a : A = go() ;
        return f(a) ;
    }

    abstract public function go( ) : A ;
} 

// A concrete class.
class UnitP<A> extends Process<A> {
    var _a : A ;

    public function new( a : A ) {
       _a = a ; }

    public override function go() : A { return _a ; }
}

我能得到的最接近的方法是将Process 定义为一个接口,并用一个概念上的抽象类ProcessA 来实现它,它定义了这两种方法; goProcessA 中的实现只是崩溃了。然后我可以从 ProcessA 扩展我在概念上具体的类。

【问题讨论】:

  • Haxe 的“抽象”是完全不同的东西,所以不,不是开箱即用的。您的解决方案有效,也许宏可以实现(宏不能实现什么?)。
  • 好吧,我的解决方案只能在有限的范围内发挥作用。如果我忘记在具体类中覆盖 go 或实例化 ProcessA,则不会出现编译时警告。

标签: haxe


【解决方案1】:

正如 MSGhero 所提到的,Haxe 本身并不支持 Java 风格的抽象。不过有几个人要求,所以 Andy Li 编写了一个宏来为 Haxe 用户提供类似的功能:

https://gist.github.com/andyli/5011520

【讨论】:

  • 这个宏在 haxelib 中可用吗?
【解决方案2】:

我如何在 Haxe 中做类似的事情

  • 将构造函数设置为私有,以确保不会创建抽象类的实例。
  • 创建一个包含所有必须实现的方法的接口
  • 创建一个继承自抽象并实现接口的类。

    // An interface
    interface IProcess<A, B> {
        public function then( f : A -> AProcess<B> ) : AProcess<B>;
    
        public function go() : A;
    }
    
    // An abstract class.
    class AProcess<A, B> {
        private function new() {}
    
        public function then<B>( f : A -> AProcess<B> ) : AProcess<B> {
            var a : A = go() ;
            return f(a) ;
        }
    
        private function go() : A {};
    }
    
    // A concrete class.
    class UnitP extends AProcess<A, B> implements IProcess {
        var _a : A ;
    
        public function new( a : A ) {
           super();
            _a = a ;
        }
    
        public function go() : A { return _a ; }
    }
    

【讨论】:

  • 这几乎就是我所拥有的(并且仍然拥有)。为了调用超类的构造函数,是否需要显式调用“super()”? (在 Java 中,如果没有显式调用“super”或“this”,则对 super() 的调用是隐式的。)
猜你喜欢
  • 2011-02-21
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 2023-03-20
  • 2018-04-26
  • 2016-05-10
相关资源
最近更新 更多