using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace 接口
{
public interface IFlyable
{
void liftoff();
}
public class Bird:IFlyable
{
public virtual void liftoff()
{
Console.WriteLine("Bird has lift off!!");
}
} public class Superman:IFlyable
{
public void liftoff()
{
Console.WriteLine("Superman has lift off!!");
}
} public class Sparrow : Bird
{
public override void liftoff()
{
Console.WriteLine("Sparrow has lift off!!");
}
} public abstract class Ufo:IFlyable //抽象类的存在只为被继承 抽象方法只允许在抽象类中定义而且不能在其中被实现
{ public virtual void liftoff()
{
Console.WriteLine("UFO has lift off!");
}
} public class MarsUfo : Ufo
{
public override void liftoff()
{
Console.WriteLine("UFO take-off from Mars");
}
} public class Car
{
} public class TestInterface1
{
public static void Test1()
{
//IFlyable fly = new IFlyable();//flase 无法创建接口的实例 但如果new的是 Superman类 的话则编译能通过(其它非实现该接口的类均不可以) IFlyable fly = new Superman(); //该类实例化了这个接口 故可以把它当接口来使用
fly.liftoff(); //这跟类实例化对象不同 类拥有的方法他不一定有 而接口有点类的实例一定有 接口关心的是“合同”里面的内容 fly = null; // 这样子做比较安全 目的跟c++ 不声明为初始化的指针一样 为了安起见
fly=new Bird (); //指向 鸟
fly.liftoff(); //多态
Console.WriteLine("--------------------");
} public static void Test2()
{
//接口允许派生类使用
IFlyable fly=new Bird();
fly = new Sparrow();
fly.liftoff();
Console.WriteLine("-----------------------");
} public static void Test3()
{
//IFlyable fly=new Ufo (); //抽象类不能 当作接口 抽象类无法创建对象
Ufo ufo = new MarsUfo(); //抽象父类 实例子类是可以的 IFlyable fly = ufo; //可以被抽象类的子类实现 fly.liftoff();
} public static void Test4()
{
Superman obj1 = new Superman();
//UseInterface(obj1 ); Bird obj2 = new Sparrow();
//UseInterface(obj2); Car obj3 = new Car();
//UseInterface(obj3);//不是接口
UseInterface2(obj1 );
UseInterface2(obj3); } public static void UseInterface(IFlyable fly)
{
fly.liftoff();
} public static void UseInterface2(object obj)
{ //if (obj is IFlyable )
//{
// IFlyable fly = (IFlyable)obj;
// fly.liftoff();
//}
//else
//{
// Console.WriteLine("{0}没有实现接口",obj);
//}
IFlyable fly=null;
fly=obj as IFlyable;//IFlyable fly=obj as IFlyable
if (fly==null)
{
Console.WriteLine("转换失败");
}
else
{
fly.liftoff();
}
}
}
}

C#----接口与抽象类的更多相关文章

  1. 从接口、抽象类到工厂模式再到JVM来总结一些问题

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 涉及到的知识点总结如下: 为什么使用接口? 接口和抽象类的区别 简单工厂模式总结 Java中new和newInstance的区别 J ...

  2. (转)深入理解Java的接口和抽象类

    原文地址: http://www.cnblogs.com/dolphin0520/p/3811437.html 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP ...

  3. c++ 接口和抽象类

    其实对抽象类与接口的区别一直是搞不太清楚,最近正在学习<设计模式>,期间用到了很多c++多态的知识.这是才恍然发现,是应该整理下这方面的知识了.但在翻阅书本.上网查阅资料之际,发现有篇文章 ...

  4. android中接口和抽象类的区别

    最近发现很多基础有点生疏了,特地写一点博客来巩固一下.今天主要来谈谈接口和抽象类的区别,我们在项目的很多地方都会用到接口或者抽象类,但是它们之间的一些区别和相同点不知道大家有没有注意到,还有就是,什么 ...

  5. 深入理解Java的接口和抽象类(转)

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  6. c#接口与抽象类的区别

    abstract 修饰符用于表示所修饰的类是不完整的,并且它只能用作基类.抽象类与非抽象类在以下方面是不同的: 抽象类不能直接实例化,并且对抽象类使用 new 运算符是编译时错误.虽然一些变量和值在编 ...

  7. Java接口和抽象类的区别

    今天看到项目中,写了一个抽象类,里面有很多方法继承了这类,当调用这个接口时,采用的是这个抽象类去调方法的,当时一想,这个不就是我们说的Java的多态的特征: 继承:存在继承关系的子类和父类 重写:子类 ...

  8. 深入理解Java的接口和抽象类

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  9. C#基础系列——一场风花雪月的邂逅:接口和抽象类

    前言:最近一个认识的朋友准备转行做编程,看他自己边看视频边学习,挺有干劲的.那天他问我接口和抽象类这两个东西,他说,既然它们如此相像, 我用抽象类就能解决的问题,又整个接口出来干嘛,这不是误导初学者吗 ...

  10. [Think In Java]基础拾遗1 - 对象初始化、垃圾回收器、继承、组合、代理、接口、抽象类

    目录 第一章 对象导论第二章 一切都是对象第三章 操作符第四章 控制执行流程第五章 初始化与清理第六章 访问权限控制第七章 复用类第九章 接口 第一章 对象导论 1. 对象的数据位于何处? 有两种方式 ...

随机推荐

  1. Qt 怎么画一个圆角矩形对话框,或者圆角控件

    1. 2. 在自定义控件的 构造函数中加入如下一段断码 this->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); //隐藏对话框标题 ...

  2. jquery带下拉菜单和焦点图

    jQuery,下拉菜单,二级菜单,索引按钮,焦点图代码,jquery带下拉菜单和焦点图是一款顶部通栏带二级下拉菜单和banner导航菜单代码. JQuery特效代码来源:http://www.huiy ...

  3. webpack 教程资源目录

    初级教程 webpack-howto 作者:Pete HuntWebpack 入门指迷 作者:题叶 webpack-demos 作者:ruanyf一小时包教会 —— webpack 入门指南 作者:V ...

  4. 分享知识-快乐自己:Maven 相关原理

    依赖原则:解决模块工程之间的Jar冲突问题 1):情定设定:验证路径最短者优先原则 创建三个工程如下: Hello:并且以来 log4j.1.2.17.jar HelloFriend:依赖了工程 He ...

  5. Python中如何从数据库把数据导入excel中

    import pymysql,xlwt #1.连接mysql #2.执行sql语句 #3.获取到sql执行结果 #4.写入excel def conn_mysql(sql): conn = pymys ...

  6. Python基础-os、sys模块

    一,os模块import os ,sysos.system('ipconfig')#执行操作系统命令,获取不到返回结果 os.popen()#也可以执行操作系统命令,可以返回命令执行结果,但需要rea ...

  7. redis的缓存穿透 缓存并发 缓存失效

    我们在用缓存的时候,不管是Redis或者Memcached,基本上会通用遇到以下三个问题: 缓存穿透 缓存并发 缓存失效 一.缓存穿透 Paste_Image.png Paste_Image.png ...

  8. 【ML】关于神经网络优化问题的随笔记

    1. 为什么不去试着最大化正确分类的图像数量而使用二次代价函数? 在神经网络中,被正确分类的图像数量所关于权重和偏置的函数并不是一个平滑的函数.大多数情况下,对权重和偏执做出的微小变动完全不会影响被正 ...

  9. bzoj 1670 Building the Moat护城河的挖掘 —— 凸包

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1670 单调栈维护凸包即可,用叉积判断: 维护上凸壳,然后把所有点的纵坐标翻转再求上凸壳即可, ...

  10. PythonPath在Windows 下的设置

    今天在调试Evernote SDK时, 遇到PythonPath的问题. 查了很多资料,有说用系统环境变量添加PythonPath, 有说在注册表中的PythonPath添加新Default字段, 但 ...