![cover](https://img-blog.csdnimg.cn/img_convert/5bbc102f2243430991aedee1be20b4f3.png)
SV/C++/Java/C#/Pyton有关虚函数/抽象函数/抽象类/接口的总结
SV/C++/Java/C#/Pyton有关虚函数/抽象函数/抽象类/接口的总结
一、SystemVerilog
接口 interface/virtual interface
虚函数/抽象方法/抽象Task virtual
纯虚函数/方法 pure virtual
继承 implements(接口类) extends(抽象类和普通类)
抽象类 virtual class
1)抽象类为子类设置prototype
2)抽象类不可以被实例化,只可以被继承
3)在抽象类中,可以只包含方法的原型,可以没有实现,就是一个方法的声明
接口类 interface class,方法全为纯虚函数
来自 <Systemverilog interface class_system verilog interface class-CSDN博客>
二、C++
虚函数 virtual
纯虚函数 virtual xxx = 0
抽象类
1)最少具有一个纯虚函数。
2)可以有实现的方法。
3)可以进行变量定义。
4)可以继承抽象类而不实现抽象方法。
5)当试图创建一个功能的多个版本时,当创建的对象之间存在某种关系时,我们使用抽象类。
来自 <C++ 接口和抽象类 - 知乎>
接口
1)所有的函数必须被声明为纯虚函数。
2)没有变量的声明。
3)实现接口的类必须实现接口的所有方法。(实现接口的类必须实现接口的所有方法 类实现接口,必须实现接口的全部方法么?_实现类必须实现接口的所有方法吗-CSDN博客)
4)当实现的功能彼此不相关时,创建的每个对象都是独立的,我们使用接口
来自 <C++ 接口和抽象类 - 知乎>
三、JAVA
继承 implements(接口) extends(抽象类和普通类)
抽象方法 abstract 只有声明,而没有具体的实现
覆写 @override
抽象类 如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用 abstract 关键字修饰,因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。
1)抽象方法必须为 public 或者 protected(因为如果为 private,则不能被子类继承,子类便无法实现该方法),默认情况下默认为 public。
2)抽象类不能用来创建对象;
3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为 abstract 类。
4)抽象类和普通类一样,同样可以拥有成员变量和普通的成员方法
5)可以直接在抽象类中添加具体的实现,子类可以不进行变更
接口 interface 尽管Java的接口中可以有变量的定义,但是变量也是会被final和static修饰。
1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
5)如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。
虚函数 JAVA没有单独的虚函数,但是有对应的多态,所以可以认为普通函数就是虚函数。
四、Python
抽象函数 使用ABC模块的@abstractmethod以及pass来描述
五、C#
虚函数/方法 virtual
1)虚方法必须有实现部分,并为派生类提供了覆盖该方法的选项;
2)虚方法不是只能在抽象类中声明也不必要在派生类中重写;
3)包含虚方法的类可以实例化
抽象函数/方法 abstract
1)抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化;
2)抽象方法只能在抽象类中声明, 抽象方法必须在派生类中重写(跟接口类似);
3)包含抽象方法的类不能实例化
抽象类 abstract class 如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的
1)抽象类无法实例化。
2)抽象类可以包含抽象方法和访问器。
3)由于两个修饰符的含义相反,因此无法使用密封的(C#Reference)修饰符来修改抽象类。Sealed修饰符可防止类被继承,而abstract修饰符则需要继承一个类。
4)抽象方法必须定义在抽象类中,抽象类也可以定义非抽象方法。
5)因为抽象方法声明不提供任何实际实现,所以没有方法主体;方法声明仅以分号结尾,并且签名后没有花括号({})。
覆写 override
1)重写基方法必须具有与override方法相同的签名。
2)override声明不能更改virtual方法的可访问性,且override方法与virtual方法必须具有相同级别访问修饰符。
3)不能用new、static、virtual修饰符修改override方法。
4)重写属性声明必须指定与继承的属性完全相同的访问修饰符、类型和名称。
5)重写的属性必须是virtual、abstract或override。
6)不能重写非虚方法或静态方法。
7)父类中有abstract,那么子类同名方法必定有override,若父类中有 virtual方法,子类同名方法不一定是override,可能是overload。
8)override必定有父子类关系。
接口 Interface
1)不能实例化;
2)包含未实现的方法声明;不允许使用 public、private、protected、internal 访问修饰符。不允许使用 static、virtual、abstract、sealed 修饰符。不能定义字段。
3)派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);
4)接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员。
更多推荐
所有评论(0)