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接口的继承
{
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只是思想,故看明白一个就说通的, ...
随机推荐
- php.ini 配置文件的深入解析
[PHP] ; PHP还是一个不断发展的工具,其功能还在不断地删减 ; 而php.ini的设置更改可以反映出相当的变化, ; 在使用新的PHP版本前,研究一下php.ini会有好处的 ;;;;;;;; ...
- LeetCode 342
Power of Four Given an integer (signed 32 bits), write a function to check whether it is a power of ...
- [改善Java代码]数组的真实类型必须是泛型类型的子类型
List接口的toArray方法可以把一个结合转化为数组,但是使用不方便,toArray()方法返回的是一个Object数组,所以需要自行转变. toArray(T[] a)虽然返回的是T类型的数组, ...
- css cursor url用法格式详解
css cursor url用法格式:css:{cursor:url('图标路径'),auto;} //IE,FF,chrome浏览器都可以 实例代码:html{cursor: url("h ...
- 踩到两只“bug”
近期在修复ex和头儿的代码时,碰到两个特别点的bug,其实也不能称之为bug,非常简单的用法,稍不严谨点可能就出错了. 第一个是in_array,大家都知道功能是检查一个值是否在数组中,第三个参数传入 ...
- 为EditText设置OnTouchListener事件监听
在项目中需要在EditText输入前,判断某个值是否已经有值,有才可以输入,为NULL值则提示不让输入,先填写指定的编辑框 自己试过监听获取焦点事件,来设置setFocusable(true)或者se ...
- Android之帧动画
MySurfaceView类: package com.fm; import android.content.Context; import android.graphics.Bitmap; impo ...
- .Net 微信开发与微信支付
.NET https://github.com/JeffreySu/WeiXinMPSDK JAVA http://git.oschina.net/pyinjava/fastweixin ...
- .NET的JSNO 序列化跟反序列化
由于本人最近在写webservice,之前一直都同通过AJAX,在服务端处理业务,但是最近需要写一些接口给其他人用,需要使用jsno的序列化与反序列化,什么是jsno就不多说,jsno的好处也不多说, ...
- 关于百度编辑器UEditor(1.4.3)在C#.NET中的应用实例
首先去百度UEditor官网下载 1.4.3 .net版本 http://ueditor.baidu.com/build/build_down.php?n=ueditor&v=1_4_3-ut ...