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.没有方法体. 子类必须重写抽象类的所有抽象方法,才能实例化,否则子类也为抽象类. ...
随机推荐
- MyBatis原理第四篇——statementHandler对象(sqlSession内部核心实现,插件的基础)
首先约定文中将的四大对象是指:executor, statementHandler,parameterHandler,resultHandler对象.(为了方便下面的文章说道四大对象就专指它们) 讲到 ...
- C#基础知识回顾:2.使用DbProviderFactory实现多数据库访问
ADO.Net 2.0中,在System.Data.Common中引入了一系列抽象基类,使得开发人员能够在不依赖具体数据库操作的情况下进行编写数据访问代码,它们分别是DbConnection.DbCo ...
- CSS 样式属性
大小 width 宽 body { min-width:1200px; height 高 } ...
- ExtJs 中Viewport的介绍与使用
ExtJs 中Viewport的介绍与使用 VeiwPort 代表整个浏览器显示区域,该对象渲染到页面的body 区域,并会随着浏览器显示区域的大小自动改变,一个页面中只能有一个ViewPort 实例 ...
- redis-java基础操作
安装 windows版的Redis,打开即可,默认端口6379 导入两个jar包 commons-pool2-2.3.jar jedis-2.7.0.jar 一 写配置文件 redis.setM ...
- Android照片墙-多图加载
http://blog.csdn.net/guolin_blog/article/details/9526203 照片墙这种功能现在应该算是挺常见了,在很多应用中你都可以经常看到照片墙的身影.它的设计 ...
- C#转换成Json的方法集
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Te ...
- Velocity快速入门
Velocity 介绍 Velocity是一个基于java的模板引擎.它允许任何人使用简单但功能强大的模板语言引用Java代码中定义的对象. 当Velocity用于web开发时,web设计人员可以与J ...
- SD从零开始47-50, 装运成本基础、控制、结算, 信用/风险管理概述
[原创] SD从零开始47 装运成本基础 详细的装运成本处理Shipment Cost Processing in Detail 装运成本计算和装运成本结算可用于内向和外向交货: 装运成本记录在一张新 ...
- 【webpack】webpack.base.conf.js基础配置
var path = require('path') // node路径模块 var utils = require('./utils') // 对vue-loader对于css预编译一些提取的工具模 ...