C# 抽象类和接口
2016-08-03 17:50
183 查看
在介绍抽象类和接口之前,首先介绍一下访问修饰符
public:公共的,没有任何限制,所有代码都可以访问
private:私有的,只有类内部可以访问
protected:受保护的,只有本类或派生类中可以访问
internal:当前程序集中任何代码都能访问
protected internal:当前程序集中的派生类或本类可以访问
static:静态的,作用于类,不作用于类的实例,通过类名进行访问
new::创建对象,分配内存。隐藏基类同名成员,泛型约束
const:用户标识常量,常量默认都是static类型
redonly:只读的。
extern:扩展的,成员在外部用另一种语言实现。
sealed:密封的,密封类表示类不能被继承
virtual:虚方法,子类可以重写基类的方法
override:子类重写基类方法所用的关键字
abstract:抽象的,子类可以重写。抽象方法没有实现。
抽象类,是类的一个抽象体,使用abstract关键字标识。抽象类可以有实例方法,也可以有抽象方法。但是,有抽象方法的类一定是抽象类,抽象类不能被实例化。
类默认的访问修饰符是internal。当前程序集可以访问。
上述代码为抽象类和抽象方法的定义和使用,总结几个抽象类的特点:
采用abstract标识的类是抽象类,采用abstract标识的方法是抽象方法
任何类如果不显示指定访问修饰符默认都是internal
抽象方法必须指定访问修饰符,因为默认,类中方法都是private,这对抽象方法来说没有意义,抽象方法必须要子类实现。
抽象方法没有方法体
抽象类中可以有实例方法。
抽象类不能被实例化
抽象类异是类,是类就只能单继承
接口是包含一组函数型方法的数据结构,是抽象的。用interface关键字修饰,接口默认访问修饰符是internal。
上述代码为接口的定义和使用,特点:
使用关键字interface,默认访问修饰符是internal。
接口中的方法不能有访问修饰符,默认都是public
接口不能包含实例方法
接口中的方法没有方法体
接口不能被实例化
接口支持多继承
相同点:
1. 子类必须实现其未实现的方法
2. 都不能被实例化
3. 接口和抽象类默认访问修饰符都是internal
不同点:
1. 关键字不同,抽象类使用abstract,接口使用interface
2. 接口不能包含实例方法,抽象类可以
3. 接口支持多继承,抽象类只能单继承
4. 接口中的方法不能有访问修饰符,抽象类可以
public:公共的,没有任何限制,所有代码都可以访问
private:私有的,只有类内部可以访问
protected:受保护的,只有本类或派生类中可以访问
internal:当前程序集中任何代码都能访问
protected internal:当前程序集中的派生类或本类可以访问
static:静态的,作用于类,不作用于类的实例,通过类名进行访问
new::创建对象,分配内存。隐藏基类同名成员,泛型约束
const:用户标识常量,常量默认都是static类型
redonly:只读的。
extern:扩展的,成员在外部用另一种语言实现。
sealed:密封的,密封类表示类不能被继承
virtual:虚方法,子类可以重写基类的方法
override:子类重写基类方法所用的关键字
abstract:抽象的,子类可以重写。抽象方法没有实现。
抽象类
抽象类的概念:抽象类,是类的一个抽象体,使用abstract关键字标识。抽象类可以有实例方法,也可以有抽象方法。但是,有抽象方法的类一定是抽象类,抽象类不能被实例化。
类默认的访问修饰符是internal。当前程序集可以访问。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication21 { class Program { static void Main(string[] args) { BaseClass bc = new DerviedClass(); bc.printf(); } } abstract class BaseClass { public abstract void printf(); protected void Func() { Console.WriteLine("BaseClass.Func."); } } class DerviedClass : BaseClass { public override void printf() { base.Func(); Console.WriteLine("DerviedClass.printf."); } } }
上述代码为抽象类和抽象方法的定义和使用,总结几个抽象类的特点:
采用abstract标识的类是抽象类,采用abstract标识的方法是抽象方法
任何类如果不显示指定访问修饰符默认都是internal
抽象方法必须指定访问修饰符,因为默认,类中方法都是private,这对抽象方法来说没有意义,抽象方法必须要子类实现。
抽象方法没有方法体
抽象类中可以有实例方法。
抽象类不能被实例化
抽象类异是类,是类就只能单继承
接口
接口的概念:接口是包含一组函数型方法的数据结构,是抽象的。用interface关键字修饰,接口默认访问修饰符是internal。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication21 { class Program { static void Main(string[] args) { IBase bc = new DerviedClass(); bc.printf(); } } interface IBase { void printf(); } class DerviedClass : IBase { public void printf() { Console.WriteLine("DerviedClass.printf."); } } }
上述代码为接口的定义和使用,特点:
使用关键字interface,默认访问修饰符是internal。
接口中的方法不能有访问修饰符,默认都是public
接口不能包含实例方法
接口中的方法没有方法体
接口不能被实例化
接口支持多继承
接口和抽象类的区别
经过抽象类和接口的特点,总结出两者的区别:相同点:
1. 子类必须实现其未实现的方法
2. 都不能被实例化
3. 接口和抽象类默认访问修饰符都是internal
不同点:
1. 关键字不同,抽象类使用abstract,接口使用interface
2. 接口不能包含实例方法,抽象类可以
3. 接口支持多继承,抽象类只能单继承
4. 接口中的方法不能有访问修饰符,抽象类可以
密封类
使用sealed关键字标识的类是密封类,密封类不能被继承。典型的密封类即 String相关文章推荐
- C#面象对象学习:接口与抽象类
- 【原创】抽象类和接口的区别(C#)
- c#接口和抽象类的区别
- C#中抽象类和接口
- c#接口和抽象类的区别 ---- 面向对象概念
- C#中抽象类和接口的区别
- C#中接口和抽象类的使用上的主要差别在哪里?
- the Differences between abstract class & interface in C#接口和抽象类的区别
- C#中接口与抽象类的区别
- c#接口和抽象类的区别
- C#中的接口和抽象类的比较
- C#中接口与抽象类的区别
- C#之接口与抽象类的区别
- 【转】 C#中接口与抽象类的区别
- c#接口和抽象类的区别 最佳回答
- c#中的抽象类和接口
- C#之抽象类和接口区别总结
- C#中抽象类和接口
- c#接口和抽象类的区别
- c#接口和抽象类的区别 (Zhuang)