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.没有方法体. 子类必须重写抽象类的所有抽象方法,才能实例化,否则子类也为抽象类. ...
随机推荐
- Spark入门——什么是Hadoop,为什么是Spark?
#Spark入门#这个系列课程,是综合于我从2017年3月分到今年7月份为止学习并使用Spark的使用心得感悟,暂定于每周更新,以后可能会上传讲课视频和PPT,目前先在博客园把稿子打好.注意:这只是一 ...
- 表格列mouse经过时高亮显示
前几天Insus.NET有练习<表格行mouse经过时高亮显示>http://www.cnblogs.com/insus/p/3715733.html ,今天有奇想,是否可以实现mouse ...
- Win10 注册IIs4.0的解决方案
随着Win10的出现,越来越多的人装上了Win10,尤其是程序员,由于Win10是一个新的操作系统,但现有软件的兼容性等各方面都是未知,难免会存在很多坑,就拿IIS来说,我刚装完win10系统,然后装 ...
- Groovy中枚举简单使用--一对一映射
enum LevelEnum { S(1), C(2), B(3), A(4), X(5) private int value LevelEnum( int value) { this.value = ...
- mongdb基本操作和更新操作
1.创建数据库 use hqj 不会真正的创建db,只有insert之后才会创建2.查看数据库show dbs3.插入文档db.hqj.insert({name:'111'})4.查看所有的文档sho ...
- MySQL设计之三范式的理解
转自:https://blog.csdn.net/wangqyoho/article/details/52900585 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要 ...
- Code Signal_练习题_evenDigitsOnly
Check if all digits of the given integer are even. Example For n = 248622, the output should beevenD ...
- [js常用]页面滚动的顶部,指定位置或底部,平滑滚动
js平滑滚动到顶部.底部.指定地方 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- vue中prop传值时加不加v-bind(冒号:)
前言:有关Vue中父组件通过prop传值给子组件时,是否加v-bind的问题,没弄清楚时感觉很乱,弄清楚之后很简单. 由于结果记起来很容易,所以先给出结果: 只有传递字符串常量时,不采用v-bind形 ...
- CSS画0.5px的线
今天遇到一个需求,画0.5px的线,查了以下资料,主要以scale方法为主.代码如下: /*0.5px上边框*/ .half_top_border_before:before{ content: &q ...