从D中的类声明中调用方法

时间:2013-12-06 04:22:52

标签: d

因此,来自Ruby,这是一种常见的模式:

class Animal
  class << self
    def type(*args)
      if args.length == 1
        @type = type.first
      else
        @type
      end
    end
  end
end

class Dog < Animal
  type "Mammal"
end

Dog.type # => "Mammal"

但是我无法在D中工作:

class Animal {
  static string animalType;

  static void type(string type) {
    animalType = type;
  }
}

class Dog : Animal {
  type(cast(string)"Mammal");
}

我收到编译错误:

Error: unexpected ( in declarator
Error: basic type expected, not cast
Error: found 'cast' when expecting ')'
Error: no identifier for declarator type(int)
Error: semicolon expected following function declaration
Error: Declaration expected, not '('

这可能吗?

3 个答案:

答案 0 :(得分:4)

this是一个类构造函数,在派生类(Dog)中,您可以使用super(...)

调用它
import std.stdio;

class Animal {
  string animalType;

  this(string type) {
    animalType = type;
  }
}

class Dog : Animal {
  this () {
    super("Mammal");
  }
}

void main () {
    auto d = new Dog();
    writeln(d.animalType);  // Mammal

    auto a = new Animal("Xyz");
    writeln(a.animalType);  // Xyz
}

答案 1 :(得分:3)

您确定您的Ruby代码有效吗?我可能从未做过任何Ruby编程,所以我不确定我要问的是什么。 - 你不必继承动物吗?换句话说,我认为您的代码中需要class Dog < Animal。对?如果是这种情况,那么您的D代码与您的Ruby代码不同。在您的D代码中, type()方法是 static

Ruby代码可能会像这样翻译成D:

import std.stdio;

class Animal {
    private string _type;

    public void type(string arg) @property {
        _type = arg;
    } // type() method

    public string type() @property {
        return _type;
    }

    public override string toString() {
        return "type: " ~ _type;
    }
} // Animal class

class Dog : Animal {
    this() {
        type("Mammal");
    } // Dog constructor (default)
} // Dog class

void main() {
    auto dog = new Dog;
    writeln(dog);
}

这是一个DPaste,你可以玩它:http://dpaste.dzfl.pl/ae83be11

答案 2 :(得分:3)

不,不可能。呃,我撒谎,但不是真的。

class Animal {
  static string animalType;

  static int type(string type) {
    animalType = type;
    return 0;
  }
}

class Dog : Animal {
  enum r = Animal.type("Mammal");
}
test.d(5): Error: animalType cannot be modified at compile time

要跟进你的第二个问题:“那么在类级别设置它的能力是不可能的?你必须实例化狗才能获得它的类型?”

都能跟得上:

mixin template AnimalType(string t) {
    enum animalType = t;
    override string type() {
        return animalType;
    }
}
abstract class Animal {
    string type();
}

class Dog : Animal {
    mixin AnimalType!"Mammal";
}

void main() {
    assert(Dog.animalType == "Mammal");
    Animal snake = new Dog();
    assert(snake.type == "Mammal");
}