📜  Dart的抽象类

📅  最后修改于: 2021-09-02 05:27:38             🧑  作者: Mango

Dart的抽象类是为那些包含一个或多个抽象方法(没有实现的方法)的类定义的。而要声明抽象类,我们使用abstract关键字。因此,必须注意,声明为抽象的类可能包含也可能不包含抽象方法,但如果它包含抽象方法,则它必须是抽象类。
抽象类的特点:

  • 包含抽象方法的类必须声明为抽象的,而声明为抽象的类可能有也可能没有抽象方法,即它可以有抽象或具体的方法
  • 一个类只能使用abstract关键字声明为抽象类。
  • 不能初始化声明为抽象的类。
  • 抽象类可以扩展,但是如果继承抽象类,则必须确保其中的所有抽象方法都提供了实现。

通常,抽象类用于实现扩展子类的抽象方法。
句法:

abstract class class_name {

    // Body of the abstract class
}

覆盖抽象类的抽象方法 –

Dart
// Understanding Abstract class in Dart
 
// Creating Abstract Class
abstract class Gfg {
    // Creating Abstract Methods
    void say();
    void write();
}
 
class Geeksforgeeks extends Gfg{
    @override
    void say()
    {
        print("Yo Geek!!");
    }
 
    @override
    void write()
    {
        print("Geeks For Geeks");
    }
}
 
main()
{
    Geeksforgeeks geek = new Geeksforgeeks();
    geek.say();
    geek.write();
}


Dart
// Understanding Abstract Class In Dart
// Creating Abstract Class
abstract class Gfg {
    // Creating Abstract Method
    void geek_info();
}
 
// Class Geek1 Inheriting Gfg class
class Geek1 extends Gfg {
    // Overriding method
    @override
    void geek_info()
    {
        print("This is Class Geek1.");
    }
}
 
// Class Geek2 Inheriting Gfg class
class Geek2 extends Gfg {
    // Overriding method again
    @override
    void geek_info()
    {
        print("This is Class Geek2.");
    }
}
 
void main()
{
    Geek1 g1 = new Geek1();
    g1.geek_info();
    Geek2 g2 = new Geek2();
    g2.geek_info();
}


输出:

Yo Geek!!
Geeks For Geeks

解释:
首先,我们声明一个抽象类 Gfg 并在其中创建一个抽象方法 geek_info。之后,我们将 Gfg 类扩展到第二个类并覆盖方法 say() 和 write(),这会产生它们各自的输出。
笔记:
当只有一个类扩展抽象类时,重写方法不是强制性的,因为重写用于更改预定义的代码,并且在上面的情况下,方法内部没有定义任何内容,因此上面的代码将起作用没有覆盖就好了。
在两个不同的类中覆盖抽象类的抽象方法 –

Dart

// Understanding Abstract Class In Dart
// Creating Abstract Class
abstract class Gfg {
    // Creating Abstract Method
    void geek_info();
}
 
// Class Geek1 Inheriting Gfg class
class Geek1 extends Gfg {
    // Overriding method
    @override
    void geek_info()
    {
        print("This is Class Geek1.");
    }
}
 
// Class Geek2 Inheriting Gfg class
class Geek2 extends Gfg {
    // Overriding method again
    @override
    void geek_info()
    {
        print("This is Class Geek2.");
    }
}
 
void main()
{
    Geek1 g1 = new Geek1();
    g1.geek_info();
    Geek2 g2 = new Geek2();
    g2.geek_info();
}

输出:

This is Class Geek1.
This is Class Geek2.

解释:
首先,我们声明一个抽象类 Gfg 并在其中创建一个抽象方法 geek_info。之后,我们将 Gfg 类扩展到另外两个类,并覆盖了 geek_info 方法,这会产生两个不同的输出字符串。
在这段代码中,我们必须使用 override 来重新定义两个不同类中的方法。如果我们在上面的例子中不使用覆盖将给出如下结果:

This is Class Geek1
This is Class Geek1

相同的结果被打印了两次,因为该方法没有在下一个类中重新定义。