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

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
L
LangChain Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Recent Announcements
Recent Announcements
大猫的无限游戏
大猫的无限游戏
罗磊的独立博客
MongoDB | Blog
MongoDB | Blog
博客园 - 【当耐特】
博客园 - 叶小钗
I
InfoQ
MyScale Blog
MyScale Blog
H
Help Net Security
月光博客
月光博客
Vercel News
Vercel News
B
Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
D
DataBreaches.Net
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
WordPress大学
WordPress大学
GbyAI
GbyAI
Blog — PlanetScale
Blog — PlanetScale
博客园 - Franky

博客园 - 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