惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
Vercel News
Vercel News
博客园_首页
Y
Y Combinator Blog
美团技术团队
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
阮一峰的网络日志
阮一峰的网络日志
aimingoo的专栏
aimingoo的专栏
H
Hackread – Cybersecurity News, Data Breaches, AI and More
MyScale Blog
MyScale Blog
GbyAI
GbyAI
人人都是产品经理
人人都是产品经理
T
Tailwind CSS Blog
MongoDB | Blog
MongoDB | Blog
D
DataBreaches.Net
博客园 - Franky
Engineering at Meta
Engineering at Meta
量子位
The GitHub Blog
The GitHub Blog
F
Fortinet All Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
酷 壳 – CoolShell
酷 壳 – CoolShell
N
Netflix TechBlog - Medium

博客园 - gjung

收藏 Multithreaded COM server problem Python操作IHTMLDocument2用于自动化测试 svn对比文件源码 SQL SERVER LDF日志文件过大的问题 关于网络字节序和主机字节序 经度和纬度 TUXEDO 通讯缓冲区类型 TUXEDO client端示例程序 TUXEDO自带 方便查看 - gjung TUXEDO server端示例程序 TUXEDO自带 方便查看 固定资产减值准备与累计折旧会计核算的关系 固定资产折旧方法 application 和 session区别以及使用application存储在线用户的session信息 sql server 2005的分页函数ROW_NUMBER 面向接口编程 abstract、virtual及override - gjung - 博客园 用bde连接 连接sql server2005 - gjung 网页中的控件编辑状态 从sql2000 复制数据到sql2005
抽象类与接口的区别
gjung · 2009-12-20 · via 博客园 - gjung

抽象类和接口的区别如下:
      1、在类来继承抽象类时,只需实现部分具体方法和全部抽象方法,而实现接口则要实现里面的全部方法。

2、在接口中无成员变量,而抽象类中可有成员变量。

3、引进接口主要是为了解决多继承的问题。

4、接口中不能有非抽象方法,但抽象类中可以有。

5、一个类能实现多个接口,但只能有一个父类。

6、接口并不属于继承结构,它实际与继承无关,因此无关的类也可以实现同一个接口。

关于抽象类的私有方法:

      抽象类不能被实例化。
      抽象类可以有私有的构造函数,私有的构造函数使得子类不能继承该抽象类,因为子类在继承了父类后,
      在实例化化的时候要首先调用父类的构造函数,但此处该构造函数被声明为私有的,不能访问,所以子类无法被构造出来。
      所以,拥有私有的构造函数的抽象类不能被继承。

      拥有私有的构造函数的抽象类的静态方法可被直接调用。
      具体类中的私有构造函数,这种情况最常见的是在单例模式中。

抽象类的测试代码:(说明和具体类一样,子类在构造前先调用父类的构造方法)

代码

1 using System;
2  using System.Collections.Generic;
3 using System.Text;
4 namespace ConsoleApplication2
5 {
6 class Program
7 {
8 static void Main(string[] args)
9 {
10 SubUtilityClass subUtilityClass = new SubUtilityClass();
11 subUtilityClass.diplay();
12 Console.Read();
13 }
14 }
15
16 abstract class SupperUtilityClass
17 {
18 public SupperUtilityClass()
19 {
20 Console.WriteLine("SupperUtility's constructed function invoked");
21 }
22
23 public virtual void diplay()
24 {
25 Console.WriteLine(" SupperUtility's display method invoked");
26 }
27 }
28
29 class SubUtilityClass : SupperUtilityClass
30 {
31 public SubUtilityClass()
32 {
33 Console.WriteLine("SubUtility's constructed function method invoked");
34 }
35
36 public override void diplay()
37 {
38 Console.WriteLine("SubUtility's display method invoked");
39 }
40 }
41 }
42