【设计模式之美】<Reading Notes>抽象类与接口

抽象类特性

1、抽象类不允许被实例化,只能被继承。
2、抽象类可以包含属性和方法。方法既可以包含代码实现,也可以不包含代码实现。不包含代码实现的方法叫做抽象方法。
3、子类继承抽象类,必须实现抽象类中的所有抽象方法。

接口特性

1、接口不能包含属性(也就是成员变量)
2、接口职能声明方法,方法不能包含代码实现
3、类实现接口的时候,必须实现接口中声明的所有方法。

抽象类的作用

1、代码复用
2、多态的优雅实现
关于第二点的具体解释:
继承不一定能够实现多态,继承+重写才能实现多态。
多态不一定需要抽象类,但是抽象类能够提升维护性和可读性。
如果某个方法是空实现而不是抽象类,子类可能忘记重写这个方法。
而且,一个空实现会让维护者感到奇怪。

接口的作用

解耦。接口是对行为的一种抽象,相当于一组协议。调用者只需要关注抽象的接口,而不需要了解具体的实现,可以降低代码间的耦合性。

C++通过抽象类模仿接口

C++只有抽象类,没有接口。
首先回顾之前的接口定义:
1、没有成员变量
2、只有方法声明,没有方法实现
3、实现接口的类必须实现接口中的所有方法

class Strategy {	//用抽象类模拟接口public:~Strategy();virtual void algorithm() = 0;protected:Strategy();		
};

抽象类Strategy没有定义任何属性,并且所有方法都声明为virtual类型(等同于java的abstract关键字).这样所有的方法都不能有代码实现,并且每个继承这个抽象类的子类都要实现这个方法。
从语法特性上来说,这个抽象类就相当于一个接口

使用普通类实现接口

将构造函数从public修改为protected,在方法实现中抛出异常,强制子类必须实现父类中的方法。
下面,使用java中的普通类来模拟接口

public class MockInteface {protected MockInteface() {}public void funcA() {throw new MethodUnSupportedException();}
}

MethodUnSupportedException异常,来模拟不包含实现的接口,并且能够强迫子类在继承这个父类的时候都主动实现父类的方法,否则就会在运行的时候抛出异常。

两者区别

接口与抽象的重要区别,出去语法特征,最重要的是概念上,抽象更像是一种类的定义,而接口更像是协议。前者是属于和继承的关系,而接口是包含和具有的关系。
抽象:is-a
接口:has-a,表示具有某些功能。
类的继承层次上来看,抽象类是一种自下而上的设计思路,现有子类的代码重复,再抽象成上层的父类。接口相反,是一种自上而下的设计思路,一般是先设计接口,再去考虑具体实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多线程之间共享数据的实现

1:如果每个线程执行的代码相同,可以使用同一个Runnable对象,然后将共享的数据放在Runnable里面,来实现数据的共享。 例如买票系统... package com.cn.gbx;import java.util.Date; import java.util.Random; import java.util.Time…

AIX的完整形式是什么?

AIX:高级交互式主管 (AIX: Advanced Interactive Executive) AIX is an abbreviation of "Advanced Interactive Executive". AIX是“ Advanced Interactive Executive”的缩写 。 It is a progression sequence of proprietary UNIX operating systems …

c#生成随机字符串 用做批量申请账号时的随机密码还是相当不错的

//随机字符串生成器的主要功能如下: //1、支持自定义字符串长度 //2、支持自定义是否包含数字 //3、支持自定义是否包含小写字母 //4、支持自定义是否包含大写字母 //5、支持自定义是否包含特殊符号 //6、支持自定义字符…

【C++基础】C++11的noexcept声明符 与 异常传播

目录C noexcept:1、用途2、用法1、noexcept声明符的用法:2、noexcept运算符的用法异常传播1、异常传播的定义2、异常传播中的规则3、异常传播的代价C noexcept: 1、用途 C11使用noexcept指明函数是否抛出异常: 若函数不抛异常&a…

使用IndexReader.repen提高搜索速度

1,使用indexreader创建indexsearcher. 2,indexsearcher在使用完了以后不要关闭. 3.使用indexreader.isCurrent()判断索引是否被indexwriter改动. 4,如果索引被改动,indexsearcher.close()先前那个,然后new indexsearcher(indexreader). 传string给searcher,searcher会维护一个内…

CSS中的文本格式

CSS文字格式 (CSS text formatting) CSS text properties allow you to style your text in various ways very easily. Such as color, alignment, spacing, direction, etc. CSS文本属性使您可以轻松地以各种方式设置文本样式。 例如颜色 , 对齐方式 ,…

【C++基础】重抛异常与异常的使用场景

重抛异常 异常处理程序可以重新抛出异常。 当它无法处理该异常,或想通知它的调用者发生了一个异常,此时就需要重抛异常: 1、抛出捕获的异常 try {// statements; } catch (TheException &ex) {// Do something;throw; }2、重新抛出另一…

vi @-function

vi 的功能 vi 是一个越用越强大的东西 功能: 例: 1 在插入模式 cwgadfly CTL-V ESC 看到的似: cwgadfly^[ 2 保存到g缓冲区 ESC :退出插入模式 "gdd :"g 指缓冲去个 dd删除一行 这样g缓冲去的内容是 cwgadflayESC 3 test love u 在…

CSS简写指南

1.margin 1.1 margin:1px 2px 3px(上 左右 下) 1.2 margin:2px 3px(上下 左右) 1.2 margin:1px 3px 2px 3px(上右下左) 2.padding(同上) 3.border border:1px red solid (border-width border-color border-style) 1 2 3border-width:1px 2px 3px; //最多可用四个值…

【C++基础】模板基础与函数模板

目录初识模板函数模板函数模板实例化显式实例化隐式实例化初识模板 求两个int、float、char类型的数据的最大值: C里面要这样写: int maxInt(int x, int y); double maxDouble(double x, double y); char maxChar(char x, char y);C使用函数重载&#…

scala 函数中嵌套函数_Scala合成函数

scala 函数中嵌套函数Scala中的合成功能 (Composition function in Scala) Scala composition function is a way in which functions are composed in program i.e. mixing of more than one functions to extract some results. In Scala programming language, there are mu…

js--基础

js 0为false 非0为true null为false 非null为true js 特有with(对象){}:可以确定对象所使用的范围。for(变量 in 对象)对变量和和行为进行遍历html xhtml xml :这些都是标记型文档。DOM:document object model 文档对象模型。 dom三层模型: dom1:将…

字符串的处理[C#]

//string Str1 "友情相逢"; //string Str2 "用一生爱你"; //#region char的使用 //char a a; //Console.WriteLine("IsLetter方法判断a是否为字母:{0}", Char.IsLetter(a)); …

CentOS安全设置

CentOS安全设置 删除多余的用户和用户组,修改口令文件属性,禁止[CtrlAltDelete]重启命令,防止别人ping的方法。整理自互联网。1、删除多余的用户和用户组//删除多余用户# vi /etc/passwduserdel admuserdel lpuserdel syncuserdel shutdownus…

【设计模式之美】<Reading Notes>继承与组合

继承缺点 继承是面向对象的四大特性之一,用来表示类之间的 is-a 关系,可以解决代码复用的问题。虽然继承有诸多作用,但继承层次过深、过复杂,也会影响到代码的可维护性。在这种情况下,我们应该尽量少用,甚至…

scala中何时使用下划线_在Scala中使用下划线

scala中何时使用下划线Underscore (_) character is reserved in Scala and has multiple usages in the programming language. Based on functions that use the underscore have the following usages: 下划线(_)字符在Scala中保留,并且在编程语言中有多种用法。…

如何利用C#编写网页投票器程序 如何使用代理来投票 代理IP来投票

一、前言看个图,了解下投票的过程。提交投票信息投票页 ――――――――>投票信息处理页反馈投票结果(请求页)<―――――――(响应页)一般情况下,填写投票信息,然后点提交按钮发送到响应页,这…

【设计模式之美】<Reading Notes>贫血模型与充血模型

小知识 需要了解的一些名词 1、领域驱动设计(Domain Driven Design,简称 DDD) 2、MVC 三层架构 : M 表示 Model,V 表示 View,C 表示 Controller。 它将整个项目分为三层:展示层、逻辑层、数据层…

TAFE的完整形式是什么?

TAFE:拖拉机和农用设备 (TAFE: Tractors and Farm Equipment) TAFE is an abbreviation of Tractors and Farm Equipment Limited. It is an Indian tractor manufacturer which is founded at Chennai in 1960. It is the second-largest tractor manufacturer in …

Oracle 10g 数据库的备份和还原

一、备份数据库1.在图形工具中,如sqldeveloper,pl/sqldeveloper用以下这句查找空表select alter table ||table_name|| allocate extent; from user_tables where num_rows0;2.把第一步执行得到的结果当用sql语来再次执行3.到oracle服务器上执行备份语句. 运行-cmd …