如何在Dart中调用超级构造函数?是否可以调用命名的超级构造函数?
答案 0 :(得分:56)
是的,它是,语法接近C#,这是一个默认构造函数和命名构造函数的示例:
class Foo {
Foo(int a, int b) {
//Code of constructor
}
Foo.named(int c, int d) {
//Code of named constructor
}
}
class Bar extends Foo {
Bar(int a, int b) : super(a, b);
}
class Baz extends Foo {
Baz(int c, int d) : super.named(c, d);
}
如果要初始化子类中的实例变量,super()
调用必须是初始化列表中的最后一个。
class CBar extends Foo {
int c;
CBar(int a, int b, int cParam) :
c = cParam,
super(a, b);
}
您可以在/r/dartlang上了解此super()
来电指南背后的动机。
答案 1 :(得分:5)
是的,但前提是您创建的超类和子类位于同一个库中。 (由于私有标识符在整个库中可见,因此它们被定义)。私有标识符以下划线开头。
class Foo {
Foo._private(int a, int b) {
//Code of private named constructor
}
}
class Bar extends Foo {
Bar(int a, int b) : super._private(a,b);
}
答案 2 :(得分:3)
由于dart支持将类实现为接口(Implicit interfaces),如果已实现,则无法调用父构造函数,您应使用 extends 。 如果您使用 implements 将其更改为 extends 并使用Eduardo Copat的解决方案。
答案 3 :(得分:1)
class AppException implements Exception {
final _message;
final _prefix;
//constructor with optional & not named paramters
//if not the parameter is not sent, it'll be null
AppException([this._message, this._prefix]);
String toString() {
return "$_prefix$_message";
}
}
class FetchDataException extends AppException {
//redirecting constructor with a colon to call parent two optional parameters
FetchDataException([String msg]) : super(msg, "Error During Communication: ");
}
class BadRequestException extends AppException {
BadRequestException([msg]) : super(msg, "Invalid Request: ");
}
class UnauthorisedException extends AppException {
UnauthorisedException([msg]) : super(msg, "Unauthorised: ");
}
class InvalidInputException extends AppException {
InvalidInputException([String msg]) : super(msg, "Invalid Input: ");
}
答案 4 :(得分:0)
这是我与您共享的文件,请按原样运行。您将学习如何调用超级构造函数,以及如何调用超级参数化构造函数。
/ Objectives
// 1. Inheritance with Default Constructor and Parameterised Constructor
// 2. Inheritance with Named Constructor
void main() {
var dog1 = Dog("Labrador", "Black");
print("");
var dog2 = Dog("Pug", "Brown");
print("");
var dog3 = Dog.myNamedConstructor("German Shepherd", "Black-Brown");
}
class Animal {
String color;
Animal(String color) {
this.color = color;
print("Animal class constructor");
}
Animal.myAnimalNamedConstrctor(String color) {
print("Animal class named constructor");
}
}
class Dog extends Animal {
String breed;
Dog(String breed, String color) : super(color) {
this.breed = breed;
print("Dog class constructor");
}
Dog.myNamedConstructor(String breed, String color) : super.myAnimalNamedConstrctor(color) {
this.breed = breed;
print("Dog class Named Constructor");
}
}
答案 5 :(得分:0)
class Animal {
String? color = null;
Animal() {}
void eat() {
print('Eat!');
}
}
class Dog extends Animal {
String? breed = null;
Dog(String breed, String color){
this.breed = breed;
super.color = color;
}
void bark() {
print('Bark!!!');
}
}