C#中类和接口的区别
https://www.cnblogs.com/wml-it/p/14840565.html
C#中类和接口的区别
</h1>
<div class="clear"></div>
<div class="postBody">
<div id="cnblogs_post_body" class="blogpost-body blogpost-body-html">
</h1>
<div class="clear"></div>
<div class="postBody">
<div id="cnblogs_post_body" class="blogpost-body blogpost-body-html">
C#中类和接口的区别
一、抽象类
抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。
注意:
1.抽象方法,必须存在于抽象类当中。相反,抽象类中不一定全部是抽象方法。
2.抽象方法没有方法体,继承了抽象类的子类,必须实现父类的所有的抽象方法。
3.抽象类可以被实例化,但不能通过普通的实例化new,它只能通过父类的应用指向子类的实例来间接的实例化子类。如:
Person t = new Teacher();
二、接口
接口是引用类型的,类似于类,接口内包含的全部是未实现的方法,而且接口类和方法的关键词不需要再声明abstract。和抽象类的相似之处有三点:
1.不能实例化;
2.包含未实现的方法声明;
3.派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);
另外,接口有如下特性:
接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。
除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。
三、抽象类和接口的相同点和不同点
不同点:
接口不包含方法的实现,抽象类可以包含,也可以不包含,不包含时非抽象方法时{}必须保留。
接口可以多继承,类只能单继承。
类定义可在不同的源文件之间进行拆分。
相同点:
都不能进行实例化,必须通过继承实现其抽象方法。
接口、类和结构都可以从多个接口继承。
接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。
接口和类都可以包含事件、索引器、方法和属性。
四、代码案例
抽象类:
namespace ClassDemo1 {</span><span style="color: rgba(0, 0, 255, 1)">#region</span> 类 <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">abstract</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Person { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">函数即使对象的动作</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Breath() { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">空方法体</span>
}
public void Name()
{
Console.WriteLine("人人都有姓名!");
}
public virtual void Drink() // 注意virtual,表明这是一个虚拟函数
{
Console.WriteLine("人是要喝水的!");
}
public void Eat()
{
Console.WriteLine("人是要吃饭的!");
}
public void Sleep()
{
Console.WriteLine("人是要睡觉的!");
}
}
public class Teacher :Person
{
//重定义父类方法
public new void Eat()
{
Console.WriteLine("教师是人,也是要吃饭的!");
}
//重写父类方法
public override void Drink()
{
Console.WriteLine("教师是人,也是要喝水的!");
}
//自己独有方法(动作)
public void Teach()
{
Console.WriteLine("教师的义务是要进行教授课程!");
}
}
#endregion
//测试
class Program
{
static void Main(string[] args)
{
Teacher t = new Teacher();
t.Breath();
t.Name();
t.Drink();
t.Eat();
t.Sleep();
t.Teach();
Console.ReadKey();
}
}
}
接口:
namespace InterfaceDemo1 { #region 接口 //不能进行实例化,只能通过继承实现其抽象方法 //还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。 //除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义学生接口</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> IStudent { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">未实现的方法声明;</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> study_base(); } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义职员接口</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> IEmployee { </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> work(); } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义计算机类学生接口</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> IIStudent : IStudent { </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> study_computer(); } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">接口能实现多继承,子类必须实现继承接口的所有方法</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Infostudent : IEmployee, IIStudent { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">实现学生接口</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> study_base() { Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">数学、语文和英语必须学好</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">); } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">实现职员接口</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> work() { Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">工作必须完成</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">); } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">实现计算机类学生接口</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> study_computer() { Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">计算机类的学生除学好基础课外,还要学C#</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">); } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">自己定义的方法</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> play_game() { Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">计算机类的学生除学好基础课外和学C#外,还喜欢打游戏</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">); } } </span><span style="color: rgba(0, 0, 255, 1)">#endregion</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">测试</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Program { </span><span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Main(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">[] args) { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">派生与接口的学生类</span> Infostudent infostudent = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Infostudent(); infostudent.study_base(); infostudent.work(); infostudent.study_computer(); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">学生自己独有的方法</span>
infostudent.play_game();
Console.ReadKey(); } }
}
本文来自博客园,作者:码农阿亮,转载请注明原文链接:https://www.cnblogs.com/wml-it/p/14840565.html
技术的发展日新月异,随着时间推移,无法保证本博客所有内容的正确性。如有误导,请大家见谅,欢迎评论区指正!
开源库链接,欢迎点亮:
GitHub:https://github.com/ITMingliang
Gitee:https://gitee.com/mingliang_it
GitLab:https://gitlab.com/ITMingliang
进开发学习交流群:
<div class="clear"></div>
<div id="post_next_prev">
<a href="https://www.cnblogs.com/wml-it/p/14840001.html" class="p_n_p_prefix">« </a> 上一篇: <a href="https://www.cnblogs.com/wml-it/p/14840001.html" data-featured-image="" title="发布于 2021-06-02 09:44">LINQ基础—Distinct子句</a>
<br>
<a href="https://www.cnblogs.com/wml-it/p/14839804.html" class="p_n_p_prefix">» </a> 下一篇: <a href="https://www.cnblogs.com/wml-it/p/14839804.html" data-featured-image="" title="发布于 2021-06-02 14:08">连接数据库与执行SQL语句</a>