OOP三类继承的区别
OOP继承的区别提纲:
1. 普通类继承,并非一定要重写父类方法。
2. 抽象类继承,如果子类也是一个抽象类,并不要求一定重写父类方法。如果子类不是抽象类,则要求子类一定要实现父类中的抽象方法。
3. 接口类继承。如果是一个子接口,可以扩展父接口的方法;如果是一个子抽象类,可以部分或全部实现父接口的方法;如果子类不是抽象类,则要求子类一定要实现父接口中定义的所有方法。
1.抽象类继承
在定义类的前面加上关键字abstract,那么这个类就是抽象类了,
抽象类本身无法产生实例对象,而且抽象类包含了一个以上的抽象方法,这些方法只是提供函数名称,并没有定义如何具体实现,由继承的派生类实现,
派生类同时必须实现所有抽象类的方法,否则其本身将成为另外一个抽象类。
需要我们注意的一点是,当派生类重写抽象类的方法时,要使用override关键字来重写抽象类所定义的方法
抽象类只能被继承,不能被实例化,抽象类的抽象方法是虚方法
新建person类:
public abstract class Person
{
public abstract void show();
}
public class Student : Person
{
public override void show()
{
Console.WriteLine("我是老大!");
}
}
public class Manager : Person
{
public override void show()
{
Console.WriteLine("我是管理员!");
}
}
另建一个Teacher类
class Teacher
{
public void tShow(Person person)
{
person.show();
}
}
在Main方法实现:
static void Main(string[] args)
{
Teacher teacher = new Teacher();
teacher.tShow(new Manager());
}
2.接口类继承
类和接口继承
14.2定义接口
14.3接口的继承
public static class Program
{
static void Main(String[] args) {
//-------------------------
Console.WriteLine("---第一个例子---");
BaseClass b = new BaseClass();
b.fun1();
b.fun2();
((Itest)b).fun1();
((Itest)b).fun2();
//--------------------------
Console.WriteLine("---第二个例子---");
SonOne s1 = new SonOne();
s1.fun1();
s1.fun2();
((Itest)s1).fun1();
((Itest)s1).fun2();
//----------------------------
Console.WriteLine("---第三个例子---");
b = new SonOne();
b.fun1();
b.fun2();
((Itest)b).fun1();
((Itest)b).fun2();
//----------------------------
Console.WriteLine("---第四个例子---");
SonTwo s2 = new SonTwo();
s2.fun1();
s2.fun2();
((Itest)s2).fun1();
((Itest)s2).fun2();
//----------------------------
Console.WriteLine("---第五个例子---");
b = new SonTwo();
b.fun1();
b.fun2();
((Itest)b).fun1();
((Itest)b).fun2();
//----------------------------
Console.ReadLine();
}
}
public interface Itest {
void fun1();
void fun2();
}
//1.BaseClass必须实现Itest中的所有方法 fun1,fun2
//2.应将接口方法标记为virtual,如果不显示标记,编译器会把它标记为virtual和sealed。这样派生类就无法重写接口方法了。
// 派生类可以重新继承同一个接口,并提供自己的实现。
internal class BaseClass : Itest {
//fun1将被标记为sealed,不能被重写
public void fun1() {
Console.WriteLine("BaseClass.fun1");
}
public virtual void fun2()
{
Console.WriteLine("BaseClass.fun2");
}
}
internal class SonOne : BaseClass {
//派生类无法重写基类方法fun1
new public void fun1() {
Console.WriteLine("SonOne.fun1");
}
//派生类可以重写基类方法fun2
public override void fun2()
{
Console.WriteLine("SonOne.fun2");
}
}
internal class SonTwo : BaseClass, Itest
{
//派生类无法重写基类方法fun1,new表示重新实现Itest的fun1
new public void fun1()
{
Console.WriteLine("SonOne.fun1");
}
//派生类可以重写基类方法fun2
public override void fun2()
{
Console.WriteLine("SonOne.fun2");
}
}结果:
OOP三类继承的区别的更多相关文章
- C++接口继承与实现继承的区别和选择
1.接口继承与实现继承的区别 <Effective C++>条款三十四:区分接口继承和实现继承中介绍的比较啰嗦,概括地说需要理解三点: (1)纯虚函数只提供接口继承,但可以被实现: (2) ...
- java 装饰者模式与继承的区别
装饰者模式目标 把许多要实现的功能,加载在子类上,类的继承,显得很臃肿,装饰着模式是在不改变原有类文件和使用继承的情况下,通过创建一个包装对象动态地扩展一个对象的功能,相比生成子类更为灵活 装饰者模式 ...
- python_way day10 python和其他语言的作用域 、 python2.7多继承和3.5多继承的区别 、 socket 和 socketserver源码(支持并发处理socket,多进程,多线程)
python_way day10 1.python的作用域和其他语言的作用域 2.python2.7多继承和3.5多继承的区别 3.socket和socketserver源码(并发处理socket) ...
- oc中protocol、category和继承的区别
OC中protocol.category和继承的区别以前还是有点迷糊,面试的时候说的有点混乱,现在结合一些资料总结一下. 利用继承,多态是一个很好的保持"对扩展开放.对更改封闭"( ...
- Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别
IO流 IO流用来处理设备之间的数据传输 java对数据的操作是过流的方式 流按操作数据分为两种:字节流与字符流 流按流向分为:输入流,输出流. IO流常用基类 字节流的抽象基类:InputStrea ...
- 7 -- Spring的基本用法 -- 8... 抽象Bean与子Bean;Bean继承与Java继承的区别;容器中的工厂Bean;获得Bean本身的id;强制初始化Bean
7.8 深入理解容器中的Bean 7.8.1 抽象Bean与子Bean 把多个<bean.../>配置中相同的信息提取出来,集中成配置模版------这个配置模版并不是真正的Bean,因此 ...
- Java 多线程实现接口Runnable和继承Thread区别(转)
Java 多线程实现接口Runnable和继承Thread区别 Java中有两种实现多线程的方式.一是直接继承Thread类,二是实现Runnable接口.那么这两种实现多线程的方式在应用上有什么区别 ...
- 抽象类,interface接口,接口和继承的区别
一.抽象类 需要抽象类的原因:父类方法不确定性的问题.考虑将该方法设计为抽象(abstract)方法所谓抽象方法就是没有实现的方法.所谓没有实现就是指,没有方法体.当一个类中存在抽象方法时,需要将该类 ...
- 【C#】OOP之继承那点事
前言: 继承这点事,说多不多,说少不少,这里只描述了一些我认为的基础篇,望各位大神指教.本节参照了C#高级编程和Think in java对继承的描述,我个人认为OOP只是思想,故看明白一个就说通的, ...
随机推荐
- Linux学习之路:变量值的删除、替代和替换
一.删除 var为变量名, ${var#v*r}:从左到右匹配将:头部是“v”,尾部是“r”的最短的部分删除 ${var##v*r}:从左到右匹配将:头部是“v”,尾部是“r”的最长的部分删除 ${v ...
- win10 IIS10 HTTP 错误 404.2 - Not Found
环境win10系统IIS10里边发布web应用程序的时候,出现 HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页 ...
- [改善Java代码]用偶判断,不用奇判断
建议21: 用偶判断,不用奇判断 public class Client { public static void main(String[] args) { Scanner in = new Sca ...
- 转:java 类名 this 的使用
转自: http://www.cnblogs.com/PengLee/p/3993033.html 类名.class与类名.this详解 类名.class 我们知道在java中,一个类在 ...
- (转)9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路
原文:http://www.cnblogs.com/figure9/archive/2013/01/09/2853649.html 1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也 ...
- javascript工具--控制台详解(转自 阮一峰博客)
大神这篇博客是写在2011年,主要介绍 “Firefox” 浏览器插件 “Firebug” 的操作,如今主流浏览器对控制台都已经提供了很好的支持.我自己用的最多是谷歌的 “chrome” 浏览器,下面 ...
- ibatis.net 多线程的调试
ibatis是一个挺不错的半自动orm框架,从java移植到c# 在ibatis中是支持多线程操作的,但是这几天的使用过程中发现就框架本身任然存在一些问题,可能会让你对多线程的使用并不是那么的顺利 在 ...
- Office升级到2013版后无法登录微软账号问题
自打office从2010版升级到2013版,就再也无法登录微软账号了.每次点击登录,弹出来的框就显示:this feature has been disabled by your administr ...
- C#消息模拟
C#中消息的工作流程: C#中的消息被Application类从应用程序消息队列中取出,然后分发到消息对应的窗体,窗体对象的第一个响应函数是对象中的protected override void Wn ...
- 项目中的那些事---JavaScript
一.String.charAt(index) 作用:获取字符串指定索引位置的字符 注意:index的值是0~(字符串长度-1)之间的值 <script type="text/javas ...