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只是思想,故看明白一个就说通的, ...
随机推荐
- python(1) -文件操作
很多时候我们需要对文件进行一些操作,比如读取并分析日志文件,写入日志文件等等.显然python也内置了对文件进行操作的函数. 读文件: >>> f = open('a.log','r ...
- 【原】CentOS7上安装Xwiki8.2.1
环境 CentOS 7内核版本为 3.10.0-327.el7.x86_64JDK8(jdk1.8.0_101)+Tomcat7.0.67+MySQL5.6.32XWIKI 8.2.1 xwiki- ...
- jboss之mod_cluster集群
本篇针对的mode_cluster版本是mod_cluster-1.2.6.Final-linux2-x64.tar.gz / mod_cluster-1.2.6.Final-windows-amd6 ...
- MapReduce中使用SequenceFile的方式上传文件到集群中
如果有很多的小文件,上传到HDFS集群,每个文件都会对应一个block块,一个block块的大小默认是128M,对于很多的小文件来说占用了非常多的block数量,就会影响到内存的消耗, MapRedu ...
- 安装SqlServer2008时相关问题
在安装SqlServer2008时,安装程序支持规则,老提示重启计算机 1,运行 regedit 打开注册表编辑器. 2,依次展开HKEY_LOCAL_MACHINE\SYSTEM\CurrentCo ...
- Unity3D 之暂停和继续的实现
Time.timeScale 时间缩放 当timeScale传递时间1.0时和实时时间一样快.当timeScale传递时间0.5时比实时时间慢一半. 当timeScale传递时间为0时游戏基本上暂停了 ...
- Editplus中使用正则表达式压缩代码
快捷键ctrl+H打开查找与替换窗口,勾上使用正则表达式选项,查找项输入\t|^( )+,替换范围选当前文档,选择全部替换按钮,然后查找项在输入\n,再选择全部替换按钮. 大功告成!
- 在Ubuntu下配置Apache多域名服务器
1. 目标: 在本机 实现访问不同域名 可以访问不同的目录. 即:访问a.com 进入 /var/www/a 目录下的程序,访问b.com 进入/var/www/b目录下的程序. 2.遇到的问题: / ...
- 关闭“编辑窗体”后, 主窗体的DatagridView刷新数据的问题
问题:在关闭一个窗体2后,要刷新窗体1内的datagridview的数据,直接窗体1.datagridview.datasource=dt 是没用的. 解决办法如下: 在主窗体里 创建编辑窗体时 加上 ...
- 解决TextView在显示文字的时候,一行还没显示满就跳到下一行
转载请注明:转自 http://blog.csdn.NET/u011176685/article/details/48295185 一.问题描述: Android的TextView在显示文字的时候,如 ...