在 Dart 中如何调用超级构造函数?

在 Dart 中如何调用超级构造函数? 是否可以调用命名的超级构造函数?

98814 次浏览

是的,语法接近于 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);
}

您可以在 达特朗上阅读这个 super()调用指南背后的动机。

我可以调用超类的私有构造函数吗?

是的,但是只有当您创建的超类和子类在同一个库中时才会这样做。(因为私有标识符在整个库中都是可见的,所以它们是在库中定义的)。私有标识符是以下划线开头的标识符。

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

由于 dart 支持实现类作为接口(隐式接口) ,所以如果 实施应该使用 延伸,则不能调用父构造函数。 如果您使用 工具改为 延伸并使用爱德华多科帕的解决方案。

这是一个文件,我与你共享,运行它的原样。您将学习如何调用 super 构造函数,以及如何调用 super 参数化构造函数。

// Objectives
// 1. Inheritance with Default Constructor and Parameterised Constructor
// 2. Inheritance with Named Constructor


void main() {
var dog1 = Dog("Labrador", "Black");
var dog2 = Dog("Pug", "Brown");
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");
}
}

具有可选参数的构造函数的大小写

class Foo {
String a;
int b;
Foo({this.a, this.b});
}


class Bar extends Foo {
Bar({a,b}) : super(a:a, b:b);
}
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: ");
}