C# 抽象类与接口的区别

一、 定义

  抽象类:不与具体事物相联系,表达一种抽象的概念,仅是作为其派生类的一个基类。主要用来提供多个派生类可共享的基类的公共定义。

  接口:是一种用来定义程序的协议,它描述可属于任何类或结构的一组相关行为,可以看成是实现一组类的模板。

二、 相似之处     

  1.都是引用类型

  2.不能直接实例化

  3. 包含未实现的方法声明

  4. 派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(方法、属性、事件、索引器或这4种成员的任何组合)

三、 区别

  1.抽象类是为子类提供一个自定义抽象的基类。而接口是为子类定一个规则。

  2.抽象类中可以定义成员的实现,但接口中不可以

  3.抽象类不能被密封。

  4.如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法。

  5.抽象类中可以包含字段、构造函数、析构函数、静态成员或常量等,接口中不可以。

  6.抽象类中的成员可以私有的、受保护的、内部的或受保护的内部成员,但接口中的成员必须是公共的。

四、动机

  抽象类是为了继承实现代码重用。接口是为了实现多态性。

下面分别是抽象类和接口的简单示例:

View Code
 1 namespace 用抽象类计算圆的面积
2 {
3 public partial class Form1 : Form
4 {
5 public Form1()
6 {
7 InitializeComponent();
8 }
9 /// <summary>
10 /// 抽象类
11 /// </summary>
12 /// <param name="sender"></param>
13 /// <param name="e"></param>
14 public abstract class getvalue
15 {
16 private double r = 0;
17
18 public double R
19 {
20 get { return r; }
21 set { r = value; }
22 }
23 //抽象方法
24 public abstract double value();
25 //该抽象方法没有实现,只能重写后才能用。
26 //抽象方法可以提供实现,也可以提供不实现。带实现的子类可以直接用,也可以重写后再用。
27 }
28 public class getvalue2 : getvalue //继承抽象类
29 {
30 public override double value()
31 {
32 return Math.PI * R * R;
33 }
34 }
35 private void button1_Click(object sender, EventArgs e)
36 {
37 getvalue2 g2 = new getvalue2();
38 g2.R =Convert.ToDouble((this.textBox1.Text));
39 this.textBox2.Text = g2.value().ToString();
40 }
41 }
42 }



 

View Code
 1 namespace 利用接口选择实现不同的语言
2 {
3 public partial class Form1 : Form
4 {
5 public Form1()
6 {
7 InitializeComponent();
8 }
9 /// <summary>
10 /// 声明一个借口,用于定义Speak方法,而具体Speak方法的功能的实现是在类中进行的。
11 /// </summary>
12 interface IselectLanguage
13 {
14 void Speak(string str);
15 }
16 /// <summary>
17 /// 如果与中国人说话则说汉语
18 /// </summary>
19 /// <param name="sender"></param>
20 /// <param name="e"></param>
21 class C_SpeakChinese : IselectLanguage
22 {
23 public void Speak(string str)
24 {
25 MessageBox.Show("您对中国友人说:"+str,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
26 }
27 }
28 /// <summary>
29 /// 如果与美国人对话,则说英语
30 /// </summary>
31 /// <param name="sender"></param>
32 /// <param name="e"></param>
33 class C_SpeakEnglish : IselectLanguage
34 {
35 public void Speak(string str)
36 {
37 MessageBox.Show("您对美国友人说:"+str,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
38 }
39 }
40 private void button1_Click(object sender, EventArgs e)
41 {
42 if (comboBox1.Text == (string)comboBox1.Items[0])
43 {
44 this.textBox1.Text = "编程词典好用!";
45 C_SpeakChinese c1 = new C_SpeakChinese();
46 c1.Speak(textBox1 .Text);
47 }
48 else
49 {
50 this.textBox1.Text = "how are you ?";
51 C_SpeakEnglish c2 = new C_SpeakEnglish();
52 c2.Speak(this.textBox1.Text);
53 }
54 }
55
56 }
57 }




转载于:https://www.cnblogs.com/zhangsir2012/archive/2012/03/29/2424029.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值