它时一个去除对象中不重要的细节的过程,只有那些描述了对象的本质特征的关键点才被保留。例如:苹果、香蕉,普通,桃子等。它们的共同特征就是水果。得出水果概念的过程,就是一个抽象的过程。
抽象类和方法的目的就是把多个类的共有属性拿出来,单独作为一个类来让其他类去继承。
抽象类在什么情况下比较适用
需要运用多态,并且某些方法在子类中必须重定义时。
下面看下各个语言的写法:
c++的写法
#include <iostream>
#include <string>
using namespace std;
//定义抽象类Animal
class Animal
{
public:
virtual void getName() = 0; //定义纯虚函数
};
//继承抽象类
class Dog : public Animal
{
public:
void getName()
{
cout<<"Dog name is dog\n";
}
};
class Cat : public Animal
{
public:
void getName()
{
cout<<"Cat name is cat\n";
}
};
//传入的Animal类型,实现多态
void getName(Animal* p)
{
p->getName();
}
int main()
{
Dog dog;
Cat cat;
getName(&dog);
getName(&cat);
return 0;
}
java的写法
Animal .java
package abstractclass;
//定义抽象类和抽象方法
public abstract class Animal {
public abstract void getName();
}
Cat .java
package abstractclass;
//继承抽象类和重写抽象方法
public class Cat extends Animal {
public void getName() {
System.out.println("Cat name is cat");
}
}
Dog .java
package abstractclass;
public class Dog extends Animal {
public void getName() {
System.out.println("Dog name is dog");
}
}
Main .java
package abstractclass;
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
getName(dog);
getName(cat);
}
public static void getName(Animal animal) {
animal.getName();
}
}
python的写法
import abc
class Animal:
@abc.abstractmethod
def get_name(self):
pass
class Dog(Animal):
def get_name(self):
print("Dog name is dog")
class Cat(Animal):
def get_name(self):
print("Cat name is dog")
def get_name(animal):
animal.get_name()
if __name__ == "__main__":
dog = Dog()
cat = Cat()
get_name(dog)
get_name(cat)
对比总结:
- 抽象类不能被实例化,只能被继承,然后继承类实例化;
- c++通过定义virtual修饰的函数来实现抽象类;
- java通过abstract来实现抽象类和方法,如果类中至少存在一个抽象函数,则该类必须声明为抽象类,即函数和类前都必须用abstract修饰;
- python需要借助abc模块来实现抽象类;