C#中抽象类(abstract)和接口(interface)的实现
抽象类
抽象方法是没有代码实现的方法,使用abstract关键字修饰;
- 抽象类是包含0到多个抽象方法的类,其不能实例化。含有抽象方法的类必须是抽象类,抽象类中也可以包含非抽象方法;
- 重写抽象类的方法用override关键字。
//定义一个抽象类,包含一个抽象方法,但该方法未实现
abstract class MyAbs{
public abstract void AbMethod();
}
//定义一个非抽象派生类,只能继承一个类
class MyClass:MyAbs{
public override void AbMethod(){
Console.WriteLine("此MyClass中实现父类中未实现的抽象方法!");
}
}
//在主程序中实例化一个MyClass对象,并调用AbMethod方法
static void Main(string[] args){
MyClass objMyClass = new MyClass();
objMyClass.AbMethod();
}
- 虚方法(virtual)与抽象方法(abstract)的区别
- 虚方法必须要有方法体,抽象方法不允许有方法体;
- 虚方法可以被子类(派生类)重载(override),抽象方法必须被子类重载;
- 虚方法除了在密封类中都可以写,抽象方法只能在抽象类中写。
接口
接口是一套规范,遵守这个规范就可以实现功能。
- 接口中只定义方法的原型,不能有字段和常量;
- 继承接口的类必须实现接口中所有的方法才能实例化
//隐式声明为public
public interface IPict{
//只有方法声明,没有访问修饰符,没有实现
int DeleteImage();
void DisplayImage();
}
定义派生自接口的类,并实现所有接口中的方法
public class MyImages: IPict{
//第一个方法的实现
public int DeleteImage(){
Console.WriteLine("DeleteImage实现!");
}
//第二个方法的实现
public void DisplayImage(){
Console.WriteLine("DisplayImage实现!");
}
}
在主程序中实例化一个MyImages对象,并调用DeleteImage和DisplayImage方法
static void Main(string[] args){
MyImages ofjM = new MyImages();
objM.DisplayImage();
int t = objM.DeleteImage();
Console.WriteLine(t);
}
- 多重接口实现
C#不允许多重类继承,但允许多重接口实现。但如果发生命名冲突就需要使用前缀进行显式接口实现或调用。如果继承接口的类中用显示方法实现接口中的方法时,实现方法不需加访问修饰符(public)
public interface IPict{
void DisplayImage();
}
public interface IPictManip{
void DisplayImage();
}
public class MyImages: IPict, IPictManip{
void IPict.DisplayImage(){ //如果用显示接口实现方法,则不需使用访问修饰符
Console.WriteLine("DisplayImage的IPict实现");
}
void IPictManip.DisplayImage(){
Console.WriteLine("DisplayImage的IPictManip实现");
}
}
static void Main(string[] args){
MyImages objM = new MyImages();
IPict Pict = objM; //IPict引用
Pict.DisplayImage();
IPictManip PictManip = objM; //IPictManip引用
PictManip.DisplayImage();
}
- 使用自定义接口
接口作为参数使用:接口作为参数传递了实现接口的对象
//无论谁收作业参数类型部分都不需做任何改变
private void DoCollectHomework(IHomeworkCollector collector){
collector.CollectHomework();
} DoCollectHomework(scofield);
接口作为返回值使用:接口作为返回值返回了一个实现接口的对象
private IHomeworkColletor CreateHomeworkCollector(string type){
switch(type){
case "student":
collector = new Student("Scofield", Genders.Male, , "越狱");
break;
}
//返回一个实现该接口的对象
return collector
}
collector.CollectHomework();
C#中抽象类(abstract)和接口(interface)的实现的更多相关文章
- c#中抽象类(abstract)和接口(interface)的相同点与区别
相同点: 1.都可以被继承 2.都不能被实例化 3.都可以包含方法声明 4.派生类必须实现未实现的方法 区别: 1.抽象基类可以定义字段.属性.方法实现.接口只能定义属性.索引器.事件.和方法声明,不 ...
- 抽象类 abstract 和 接口 interface 类的区别
在看一些框架的优秀改良时,都会设计一层base层,并且 base里面一般都是 abstract 类,然后 就找了为什么做的原因.发现: PHP5支持抽象类和抽象方法.抽象类不能直接被实例化,你必须先继 ...
- Java:抽象类abstract和接口Interface
一.抽象类:abstract 抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情.对于一个父类,如果它的某个方法在父类中实现出来 ...
- 【温故知新】c#抽象类abstract与接口interface
1.什么是抽象类 先来看MSDN对抽象类描述: 抽象类是一些留有部分或全部成员未实现的类,以便可以由派生类来提供实现. 在面向对象的编程中,抽象类用作层次结构的基类,并表示不同对象类型组的通用功能. ...
- C++虚函数virtual,纯虚函数pure virtual和Java抽象函数abstract,接口interface与抽象类abstract class的比较
由于C++和Java都是面向对象的编程语言,它们的多态性就分别靠虚函数和抽象函数来实现. C++的虚函数可以在子类中重写,调用是根据实际的对象来判别的,而不是通过指针类型(普通函数的调用是根据当前指针 ...
- C# 抽象方法及抽象类 Abstract 及接口
public abstract class Animal { public abstract void Dosth(); } 该类中只有虚方法 那么我们可以用abstract来修饰 将该类称为抽象 ...
- 虚方法virtual、抽象方法abstract、接口interface区别
接口.抽象类.抽象方法.虚方法: 这四个名词时非常容易混淆的: 首先说一下接口 与抽象类 的异同: 相同点: 1.他们都不能实例化自己,也就是说都是用来被继承的. 2.抽象类中的抽象方法和接口方法一样 ...
- 抽象 abstract 和 接口 interface。 java 的 堆 和 栈。 参数传递(基本类型和普通对象的区别)
package com.test; import com.test.Pro; //protected 修饰的成员只能在本包中和 继承该类的方法中使用 public abstract class Tes ...
- 抽象类 abstract class 接口
一.抽象类 1.没有具体的实例. 不可实例化,不能创建对象. 2.抽象类有构造器. 二.abstract 方法. 1.没有方法体. 子类必须重写抽象类的所有抽象方法,才能实例化,否则子类也为抽象类. ...
随机推荐
- FineUI 布局宽度自适应,后台回调js方法
FineUI页面布局,宽度自适应 @(F.Panel().CssClass().ShowBorder().BoxConfigChildMargin("0 5 0 0").ShowH ...
- 使用 Swagger UI 与 Swashbuckle 创建 RESTful Web API 帮助文件(转)
作者:Sreekanth Mothukuru2016年2月18日 本文旨在介绍如何使用常用的 Swagger 和 Swashbuckle 框架创建描述 Restful API 的交互界面,并为 API ...
- redis服务部署脚本
yum install -y gcc jemalloc-devel cd /usr/local/src curl -L -O http://download.redis.io/releases/red ...
- SSM整合的pom.xml依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- Vue, element-ui Module build failed: Error: No PostCSS Config found
使用vue框架写pc页面时,我们经常会用到element-ui这个框架. 当我们吧把需要的东西都装在好运行项目的时候,有时会出现这样的错误, Module build failed: Error: N ...
- Python爬虫入门教程石家庄链家租房数据抓取
1. 写在前面 这篇博客爬取了链家网的租房信息,爬取到的数据在后面的博客中可以作为一些数据分析的素材.我们需要爬取的网址为:https://sjz.lianjia.com/zufang/ 2. 分析网 ...
- 洛谷P3586 [POI2015]LOG(贪心 权值线段树)
题意 题目链接 Sol 显然整个序列的形态对询问没什么影响 设权值\(>=s\)的有\(k\)个. 我们可以让这些数每次都被选择 那么剩下的数,假设值为\(a_i\)次,则可以\(a_i\)次被 ...
- js-ES6学习笔记-Class(5)
1.原生构造函数会忽略apply方法传入的this,也就是说,原生构造函数的this无法绑定,导致拿不到内部属性.比如,Array构造函数有一个内部属性[[DefineOwnProperty]],用来 ...
- js-数字、字符串、布尔值的转换方式
来自JavaScript秘密花园 1.转换为字符串 '' + 10 === '10'; // true 将一个值加上空字符串可以轻松转换为字符串类型. 2.字符串转换为数字 +'010' === 10 ...
- 将caj文件转化为pdf文件进行全文下载脚本(ubuntu下亲测有用)
最近ubuntu下caj阅读器,突然崩掉了,而偏偏要准备开题,在网上搜索原因未果,准备放弃时候,突然在网上看到一个脚本,说是很好用,可以在指定页面将caj文件转化为pdf文件,亲测有用,这里直接给出脚 ...