Class

抽象类

C# 里的抽象类由 abstract 标识符显示的标识出来。

public abstract class Transformation {
    public abstract Vector3 Apply(Vector3 point);
}

与之不同的是,C++ 里的抽象类是由内部函数是否拥有一个纯虚函数定义,并没有显式的标识。

虽然 C# 里的抽象类也需要其内部至少有一个纯虚函数,但这是由设计模式定义的(否则其只需要实现为一个普通函数即可),如果没有纯虚函数,编译器也不会报错(合法但无意义)。

此外对于 “纯虚函数” 的声明,C# 与 C++ 有显著的区别。或许是为了弥补无显式说明的不便,C++ 中纯虚函数是显式声明的:

// C++ 中,纯虚函数需显式声明
class Animal {
    public:
    // 纯虚函数(没有方法体),需显式说明为 “= 0”
    virtual void MakeSound() = 0;

    // 具体方法(有方法体)
    void Sleep() {
        std::cout << "Sleeping" << std::endl;
    }
};

而 C# 中的纯虚函数则只需要不包含方法体即可实现:

// C# 中,纯虚函数只需要空置方法体即可
public abstract class Animal {
    // 抽象方法(没有方法体)
    public abstract void MakeSound();

    // 具体方法(有方法体)
    public void Sleep() {
        Console.WriteLine("Sleeping");
    }
}

此外,对于 override 关键字的标识,C# 中需要显式标识在在方法声明的前面,而 C++ 中则放在方法声明的后面,且不做强制。

// C#: override 关键字在函数声明之前
public class Dog : Animal {
    public override void MakeSound() {
        Console.WriteLine("Woof!");
    }
}
// C++:override 关键字在函数声明之后
class Dog : public Animal{
    public:
    void MakeSound() override {
        std::cout << "Woof!" << std::endl;
    }
};

Last updated