有没有办法在Haxe中将类和方法声明为抽象?

时间:2015-05-21 14:53:20

标签: haxe

在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。

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:0)

我如何在Haxe做同样的事情

  • 将构造函数设置为private,以确保没有创建Abstract类的实例。
  • 使用所有必须实施的方法创建一个接口
  • 创建一个继承自Abstract的类并实现接口。

    // 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 ; }
    }