因此,来自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 '('
这可能吗?
答案 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");
}