很奇怪的Python 3字节数组转换成字符串字符串失败问题,怎么解决

developerWorks 社区
本部分主要介绍 WAS CE 的部署工具,常用的三种部署方法:命令行部署、控制台部署和热部署,以及两种部署模式:本地部署和远程部署。
(), IBM中国软件开发中心 软件工程师
王珂, 是IBM中国软件开发中心的软件工程师,所在团队目前从事 WebSphere Application Server Community Edition 相关的产品测试、售后服务和客户支持相关的工作。
引言WAS CE 即WebSphere Application Server Community Edition 的简称,它是一个轻量级的 Java(TM) 2 Platform Enterprise Edition (J2EE) 应用服务器。有关 WAS CE 的基本概念和目录结构更详细的信息,请参阅。本部分主要介绍 WAS CE 的部署工具,常用的三种部署方法:命令行部署、控制台部署和热部署,以及两种部署模式:本地部署和远程部署。WAS CE 提供的部署工具,可用来安装、卸载、重安装、启动、停止应用和模块,也可用来安装、卸载配置信息,如部署计划的配置、安全域以及数据库连接池的配置信息等。可由命令行的方式调用部署工具,也可通过基于图形界面的控制台访问。下面分别介绍。本文描述的部署方法和部署模式适用于 WAS CE V1.0.1.2或更新版本。 注:本文中%WASCE_HOME%表示 WAS CE 的安装目录;%Sample_HOME%代表预部署示例的存放目录。文中的例子各种命令的使用以 Windows 下的用法为例。三种部署方法1.命令行部署当 WAS CE server 启动后,进入 WAS CE 安装目录下的bin目录,在这里可由两种方式激活部署工具:java -jar deployer.jar &general_options& &command& &command_options&deploy[.bat|sh]
&general_options& &command&
&command_options&general_options 定义了常规选项,适用于所有的命令。command_options 则指出针对各个指令的特殊选项。1.1 常规选项--uri &identifier&可选项。常用于远程部署。&identifier&是一个服务器要连接到的URI。如果&identifier&没有定义,部署工具将试图用本机 localhost 的标准端口 1099 连接服务器。URI有严格的使用格式:deployer:geronimo:jmx:rmi:///jndi/rmi:[//host[port]]/JMXConnector--host &host&可选项。既可用于本地部署,也可用于远程部署。在本地部署时,其默认值 localhost。而在远程部署中,&host&即是应用和资源将要部署到的服务器所在的主机名或 IP。--port &port&可选项。&port&即 server 的端口号,默认值 1099。如果在部署应用或资源之前,修改了 config.xml 文件中对应应用或资源的 port 值,则在部署时,必须用--port &port&明确说明。--driver &driver_path&可选项。您不仅可以在 WAS CE 上使用部署工具,也可以在任何遵循 JSR-88 的服务器上使用部署工具。对于非 WAS CE 服务器,必须由&driver_path&提供包含 JSR-88 部署实现类的 jar 文件。--user &username&必选项。这是身份验证时使用的用户名。如果没有提供用户名,则会提示您输入一个用户名。WAS CE 的缺省管理员用户名是"system"。--password &password&必选项。这是身份验证时使用的密码。如果没有提供密码,则 WAS CE 会尝试不用密码进行连接。如果连接失败,则会提示您输入一个密码。WAS CE 对于"system"管理员用户的缺省密码是"manager"。--syserr &select& 可选项。&select&对应Boolean,如果为true,则将错误记录到syserr设备中。缺省值为false。--verbose &select& 可选项。&select&对应 Boolean,如果为 true,则将调试信息输出到标准输出。缺省值为 false。 要获得常规选项的所有列表,请输入:deploy[.bat|sh] help options1.2 常用命令--commandWAS CE 提供了多种指令用于管理应用程序部署。常用的指令如下:deploy
undeploy 其他的指令:distribute
list-modules另外,您可以用 help 指令查看某个指令的更详细的信息。具体格式为:deploy[.bat|sh] help &command&1.2.1 deploydeploy 既可用于本地部署,也可用于远程部署。同时,deploy 必须在 WAS CE Server 已经启动后才能使用。 进入 WAS CE 安装目录下的bin目录,双击startup.bat 启动server。WAS CE Server 启动后,将显示已经启动的 module,Web Application,以及各个 Connector 和对应的侦听端口。如下图所示:1.2.1.1
deploy 的使用格式:java -jar deployer.jar &general_options& deploy &module& &deployment_plan&或deploy[.bat|sh] &general_options& deploy &module& &deployment_plan&1)&general_options& &general_options&的详细使用参考前面的常用选项说明。如果不更改 port 属性值,则系统默认 deploy 使用的端口为 1099;如果更改了 port 值,则需要明确指明 port 属性值。在 WAS CE 安装目录的 var/config 下,有一个 config.xml 文件,该文件记录了系统应用和系统模块,已经部署的应用和模块,及其对应的端口。在 server 启动之前你可以更改这里的端口,但是在使用部署工具时,必须用-- port 参数明确指出端口号。注:由于在启动 WAS CE Sever 时,将读取 config.xml,在停止 WAS CE Sever 时,各个 GBean 的状态将回写到 config.xml 文件,因此在 WAS CE Sever 运行过程中所作的任何修改均不起作用,不能保存下来,必须在 server 启动之前修改有关属性值。如将RMI端口由 1099 改为 1090。修改前:
&configuration name="geronimo/rmi-naming/1.0/car"&
&gbean name="RMIRegistry"&
&attribute name="port"&1099&/attribute&
&gbean name="NamingProperties"&
&attribute name="namingProviderUrl"&rmi://0.0.0.0:1099&/attribute&
&/configuration&修改后:&configuration name="geronimo/rmi-naming/1.0/car"&
&gbean name="RMIRegistry"&
&attribute name="port"&1090&/attribute&
&gbean name="NamingProperties"&
&attribute name="namingProviderUrl"&rmi://0.0.0.0:1090&/attribute&
&/configuration&此时,在server启动的窗口中,侦听端口也改变为 1090。Listening on Ports:
.0.0 RMI Naming
.0.0 Derby Connector
.0.0 ActiveIO Connector EJB
.0.0 Remote Login Listener此时,在使用部署工具时,也要明确指明端口。如部署 hello-1.0.war 如下:deploy --user system --password manager --port 1090 deploy
%Sample_HOME%\hello-1.0.war2)
&module&&module&对应要部署的应用或资源的文件名和位置,一个 module 文件可以是以下类型的任何一种:J2EE Enterprise Application Archive (EAR) fileJ2EE Web Application Archive (WAR) fileJ2EE Enterprise JavaBean Archive (JAR) fileJ2EE Java Resource Archive (RAR) file3)
&deployment_plan&&deployment_plan&是一个 xml 格式的文件,定义了部署应用或资源时要用到的部署计划。有些简单的应用,部署计划已经包含在 ear 或 war 包中,或者不需要部署计划,此时部署计划省略,我们称前者为内嵌部署计划。下面举例说明 deploy 的用法:deploy --user system --password manager deploy \%Sample_HOME%\hello-1.0.war在复杂的应用中,部署计划需要单独给出;或者,用显示给出的部署计划覆盖内嵌的部署计划。deploy --user system --password manager deploy %WASCE_HOME%
\repository\tranql\rars\tranql-connector-derby-embed-xa-1.1.rar
%Sample_HOME%\Cloudscape-db-plan.xml当部署成功后,窗口给出部署成功的提示:Deployed
com/ibm/websphere/ce/samples/hello @
http://&hostname&:&port&/hello注:deploy 也可以仅部署 xml 格式的文件,而不需 WAR 或 EAR 等格式的文件;此时的 xml 文件用于配置已经存在的 GBean。详情请参考关于 LDAP 的说明。1.2.1.2
deploy 的部署模式1)本地部署详细请参考 1.2.1.1 deploy 的使用格式。2)远程部署其使用格式:java -jar deployer.jar --uri
deployer:geronimo:jmx:rmi:///jndi/rmi:[//host[port]]/JMXConnector
&general_options& deploy &module& &deployment_plan&或deploy.bat --uri
deployer:geronimo:jmx:rmi:///jndi/rmi:[//host[port]]/JMXConnector
&general_options& deploy &module& &deployment_plan&例:deploy --uri deployer:geronimo:jmx://hostname --user system --password
manager deploy %Sample_HOME%\hello-1.0.war窗口显示执行的操作和部署结果:Uploading 1 file(s) to server
File upload complete
(Server :OK)
1 file(s) transferred to server. Resuming deployment operation.
Deploy com/ibm/websphere/ce/samples/hello @
http://&hostname&:&port&/hello 此时,访问 http://&hostname&:&port&/hello 即可看到预期的内容。1.2.2
login这个指令用来为当前的连接保存用户名和密码,并把这个认证信息保存到位于用户目录下的 .geronimo-deployer 文件中。以后到同一个服务器的连接都尽可能地使用已经保存下来的认证信息,而不再给出提示。连接到不同服务器的认证信息将单独保存,因此,您可以在命令行中用 --port 或 --host 或 --url 来指出连接到不同服务器的认证信息。格式为:deploy[.bat|sh]
--user &user_name& --password &password& loginlogin 之后,当您下次使用不同的指令时,就不用再输入用户名和密码,可以直接使用了。如:deploy[.bat|sh]
list-modules1.2.3
redeploy使用这个指令来停止、重新部署、启动先前已经部署的模块。格式为:deploy[.bat|sh]
&general_options& redeploy &module&
&deployment_plan& 和 deploy 指令一样,redeploy 可以部署以下类型的模块:J2EE Enterprise Application Archive (EAR) fileJ2EE Web Application Archive (WAR) fileJ2EE Enterprise JavaBean Archive (JAR) fileJ2EE Java Resource Archive (RAR) file1.2.4
start start 指令用来启动已经部署的模块。格式为:deploy[.bat|sh]
&general_options& start &moduleIDs&可以同时启动多个模块,此时,moduleIDs 用空格间隔即可。可以用 list-modules 指令来查看各个模块的 moduleID;也可查看各个模块的部署计划以得到 moduleID 的有关信息。 1.2.5
stop停止正在运行的模块。格式为:
deploy[.bat|sh]
&general_options&
&moduleIDs&可以同时停止多个模块,此时,moduleIDs 用空格间隔即可。可以用 list-modules 指令来查看各个模块的 moduleID;也可查看各个模块的部署计划以得到 moduleID 的有关信息。 1.2.6
undeploy从服务器上停止、删除模块及其所有的部署信息,而不管该模块当前是否正在运行。
格式为: deploy[.bat|sh]
&general_options&
&moduleIDs&可以同时删除多个模块,此时,moduleIDs 用空格间隔即可。可以用 list-modules 指令来查看各个模块的 moduleID;也可查看各个模块的部署计划以得到 moduleID 的有关信息。 1.2.7
distribute用来部署一个新的模块。与 deploy 不同的是,distribute 不启动模块,当需要运行通过 distribute 指令部署的模块时,需要执行 start 指令。而 deploy 则启动模块,相当于在部署的同时执行了 start 操作。格式为: deploy[.bat|sh] &general_options& distribute &module& &deployment_plan&有关&module&和&deployment_plan&的说明请参考 1.2.1.1 deploy 指令。1.2.8
list-modules列出在服务器上所有可用的模块。必须在服务器运行时才能使用该指令。格式为:
deploy[.bat|sh] &general_options& list-modules [--all | --started | --stopped] --all默认值。列出所有可用的模块。 --started列出正在运行的模块。--stopped列出停止的模块。2. 控制台部署2.1 简单描述和首页WAS CE 控制台是基于 web方式的图形操作界面,给您提供方便友好的管理 WAS CE 服务器的方式。既可用于本地部署,也可用于远程部署。只要 WAS CE 服务器已经启动,就可以通过 http://localhost:8080/console 访问控制台。首页面如图所示:输入 WAS CE 的 administrator 用户名 system 和密码 manager,即可登录到 WAS CE 的欢迎页面。对于一些需要访问数据库的复杂应用,部署的基本步骤是:1)创建数据库和表2)配置、部署数据源3)部署应用对于一些简单的部署,不需要数据源,直接部署应用即可。WAS CE 的下载网站提供了示例程序包(wasce_samples-1.0.1.2.zip)可供用户下载,在这个示例程序包中有一个用于演示员工信息的 empdemo 的示例,本文以 empdemo 为例说明如何通过控制台配置数据库,以及部署应用程序。2.2 创建数据库WAS CE 内嵌了 IBM Cloudscape 数据库,因此可以在控制台使用 DB Manager 创建 IBM Cloudscape 数据库如 Employee,并完成建表的操作。对于其他非内嵌的数据库如 oracle,DB2 等,需由数据库自带的工具来完成创建数据库,建表的功能。<h3 id="N1 配置、部署数据源在 Database Pools 下用 Geronimo database pool wizard 为数据库 Employee 建立数据源 jdbc/EmployeeDataSource。首先命名数据源,并选择正确的数据库类型。点击"next",为数据源选择驱动,配置最大连接数,最小连接数等。当选择配置完成后,点击"show plan"查看数据源部署计划,点击"Deploy"部署数据源。
IBM Cloudscape 数据源部署计划 Cloudscape-db-plan.xml 如下(部分): &dependency&
&uri&org.apache.derby/derby/10.1.2.ibm/jar&/uri&
&/dependency&
&dependency&
&uri&org.apache.derby/derbynet/10.1.2.ibm/jar&/uri&
&/dependency&
&resourceadapter&
&outbound-resourceadapter&
&connection-definition&
&connectionfactory-interface&javax.sql.DataSource
&/connectionfactory-interface&
&connectiondefinition-instance&
&name&jdbc/EmployeeDatasource&/name&
&config-property-setting
name="UserName"&&/config-property-setting&
&config-property-setting
name="Password"&&/config-property-setting&
&config-property-setting name="DatabaseName"&Employee
&/config-property-setting&
&config-property-setting name="CreateDatabase"&true
&/config-property-setting&对于非内嵌的数据库,需将数据库驱动添加到 WAS CE 的存储库(repository)。如向 WAS
CE 存储库添加 IBM DB2 的 JDBC 驱动。%WASCE_HOME%/repository/com.ibm.db2/jars/db2jcc-8.2.jar%WASCE_HOME%/repository/com.ibm.db2/jars/db2jcc_license_cu-8.2.jarDB2 数据源部署计划 DB2-db-plan.xml 如下:(部分)&dependency&
&uri&com.ibm.db2/db2jcc/8.2/jar&/uri&
&/dependency&
&dependency&
&uri&com.ibm.db2/db2jcc_license_cu/8.2/jar&/uri&
&/dependency&
&resourceadapter&
&outbound-resourceadapter&
&connection-definition&
&connectionfactory-interface&javax.sql.DataSource
&/connectionfactory-interface&
&connectiondefinition-instance&
&name&jdbc/EmployeeDatasource&/name&
&config-property-setting name="UserName"&db2inst1
&/config-property-setting&
&config-property-setting name="Password"&password
&/config-property-setting&
&config-property-setting name="Driver"&com.ibm.db2.jcc.DB2Driver
&/config-property-setting&
&config-property-setting name="ConnectionURL"&
jdbc:db2://localhost:50000/Employee
&/config-property-setting&在WAS CE 中,数据源与应用一样,都作为一个模块处理,因此部署数据源,既可以
像上面那样直接点击"Deploy"完成部署,也可以使用命令行部署,或者在控制台用 Deploy New 指定驱动和部署计划完成部署。<h3 id="N1 部署应用使用 Deploy New,指定要部署的模块和部署计划,点击 install 按钮就可完成部署任务。3. 热部署热部署是 WAS CE 提供的另一种部署方式。仅用于本地部署。3.1 部署在 WAS CE 安装目录下,有个 deploy 目录,所有需要部署的应用或模块都可以放在该目录下,WAS CE 会自动检测到该目录下的文件,并部署。例如:将需要部署的 hello 应用程序对应的文件 hello-1.0.war 拷贝到 deploy 目录,则在 Serve Window 下将提示模块部署成功,同样,在 Commad Line 下,用 list-modules 命令也可看到该应用已经部署成功。用 list-modules 查看结果如下:+ com/ibm/websphere/ce/samples/hello @ http://&hostname&:&port&/hello访问 http://&hostname&:&port&/hello 即可看到显示预期的内容,表明热部署成功。对于有部署计划的应用或模块,在热部署时,需要将部署计划和程序一同打包成支持的一种类型,然后放到deploy目录。有关部署计划的格式和存放位置详细信息,请参考。3.2 删除通过热部署部署的应用或资源,要删除时,可以直接删除 deploy 目录下相应的文件,即可完成卸载。4. 结束语本文详细介绍了 WAS CE 的部署工具,两种部署模式和三种部署方法,并举例加以说明。对初级读者,希望本文能有所帮助。在本文的基础上,相信读者应该能够着手部署自己的应用程序了。
developerWorks: 登录
标有星(*)号的字段是必填字段。
保持登录。
单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件。
在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。
所有提交的信息确保安全。
选择您的昵称
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。
您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。
标有星(*)号的字段是必填字段。
(昵称长度在 3 至 31 个字符之间)
单击提交则表示您同意developerWorks 的条款和条件。 .
所有提交的信息确保安全。
文章、教程、演示,帮助您构建、部署和管理云应用。
立即加入来自 IBM 的专业 IT 社交网络。
免费下载、试用软件产品,构建应用并提升技能。
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=WebSphere, Open sourceArticleID=146208ArticleTitle=WAS CE 部署工具和部署方法publish-date=为什么要接口和抽象类
一直使用抽象类和接口,谁能说说为什么要用这些,用了到底在项目中有什么好处了?
回答的要深刻些啊!!
有了抽象类和接口,才能有多态的实现。
不好意思,回答比较简单。
这些都是前辈的经验
//好处就是class&C调用的A或B的方法只与接口相关就好&
InterFace&IA
&void&doSomeThing();
public&class&A:IA
&public&void&doSomeThing();
public&class&B:IA
&public&void&doSomeThing();
public&class&C
&public&void&useAorB(IA&ia)
&&ia.doSomeThing();
小明在家跟妈妈说,我要吃水果
妈妈去水果摊去买水果,看看哪个便宜就买哪个。
最后买回去了橘子。
这就叫抽象类。
你在街上被人群殴,有人用棍子打你,有人用脚踹,有人用拳头。反正你费血了。
这就叫接口。
我关心的是抽象类干什么用...
感觉就和接口一样。
只是抽象的力度不同而已。
做项目的时候,你什么时候就感觉我要去定义个抽象类或者接口来帮我实现多态和减少我的代码量了?
不要说些书面上的东西。。
说来话长,路过
引用&4&楼&yuwenge&的回复:小明在家跟妈妈说,我要吃水果
妈妈去水果摊去买水果,看看哪个便宜就买哪个。
最后买回去了橘子。
这就叫抽象类。
你在街上被人群殴,有人用棍子打你,有人用脚踹,有人用拳头。反正你费血了。
这就叫接口。
接口好像不能有属性哈。
我也不是很清楚
引用&8&楼&angel6709&的回复:引用&4&楼&yuwenge&的回复:
小明在家跟妈妈说,我要吃水果
妈妈去水果摊去买水果,看看哪个便宜就买哪个。
最后买回去了橘子。
这就叫抽象类。
你在街上被人群殴,有人用棍子打你,有人用脚踹,有人用拳头。反正你费血了。
这就叫接口。
接口好像不能有属性哈。
可以有属性的吧
这样吧,你的电脑上只有一个USB接口。
这个USB接口可以接MP3,数码相机,摄像头,鼠标,键盘等。。。
好了,这里就有一个问题:所有的上述硬件都可以公用这个接口,而且有很好的扩展性。
这就是接口
你有一辆宝马的汽车,有一天,你拿它去越野了,轮胎,哎,自然爆掉,现在你想换轮胎。
你不想换宝马的轮胎,太贵。
你不想换qq的轮胎,不好使。
你想换OOOO的,换了,好用。
这就是抽象类。
接口只是对某一类事物行为的规范。
如电器,可以定义一下接口:
Close();
引用&6&楼&num23679&的回复:做项目的时候,你什么时候就感觉我要去定义个抽象类或者接口来帮我实现多态和减少我的代码量了?
不要说些书面上的东西。。
我3L写的挺清楚了
接口和抽象类都是多态。
我要拿遥控器打开电器
接口和抽象类多态的侧重点不同。
接口的侧重点在遥控器
多态的侧重点在电器
个人理解。欢迎拍砖哈。
引用&11&楼&angel6709&的回复:这样吧,你的电脑上只有一个USB接口。
这个USB接口可以接MP3,数码相机,摄像头,鼠标,键盘等。。。
好了,这里就有一个问题:所有的上述硬件都可以公用这个接口,而且有很好的扩展性。
这就是接口
你有一辆宝马的汽车,有一天,你拿它去越野了,轮胎,哎,自然爆掉,现在你想换轮胎。
你不想换宝马的轮胎,太贵。
你不想换qq的轮胎,不好使。
你想换OOOO的,换了,好用。
这就是抽象类。
能用项目中的例子来帮我解释吗?
我还是不太能理解,项目啥时要用到他们
其实我看了java的spring框架,里面有个IOC的概念,到时体现了下接口的作用,正如,楼上3楼的例子所体现。
实现了解耦。
就是想更多有个了解,啥时用接口,啥时用抽象类呢?
接口是可以有属性的。不可以有字段。
我喜欢用接口最多的情况是在反复处理一类数据时,比如画图,可能画圆,画矩形...;
这是我定义一个图形接口,要画的图形从继承这个接口;
还有就是对一些经过好几层压缩的数据文件解析时,每层的解压都继承自同一个接口;
这样我在操作的时候可以采用一个递归的方法,不需要关心我现在处理什么,只有到实现具体操作的时候才判断要做什么,这样可以节省很多代码,而且结构也很简单
引用&8&楼&angel6709&的回复:引用&4&楼&yuwenge&的回复:
小明在家跟妈妈说,我要吃水果
妈妈去水果摊去买水果,看看哪个便宜就买哪个。
最后买回去了橘子。
这就叫抽象类。
你在街上被人群殴,有人用棍子打你,有人用脚踹,有人用拳头。反正你费血了。
这就叫接口。
接口好像不能有属性哈。
接口成员:方法、属性、事件、委托
接口可以有属性。接口和抽象类是不同的。接口注重纯粹的抽象,而抽象类除注重抽象之外,还注重代码的复用。
引用&20&楼&zi__qi&的回复:接口可以有属性。接口和抽象类是不同的。接口注重纯粹的抽象,而抽象类除注重抽象之外,还注重代码的复用。
1、首先让理解接口和抽象类的使用环境
横看接口竖看类:横向扩展使用接口;纵向扩展使用抽象基类;横向和纵向都要扩展,使用抽象基类继承接口。
在差异较大的对象中追求功能上的共性时,使用接口。
在差异较小的对象中追求功能上的不同时,使用抽象基类,因为抽象基类可以包含实现的成员。
比如说,篮球场上有前锋(forward)、中锋(center)、后卫(guard),无论哪个位置,前锋、中锋和后卫都有防守和进攻的责任,另外中锋专注于篮板。这时候,可以定义运动员(player)抽象基类,抽象基类中定义虚(virtual)方法:Attack(进攻)、Defense(防守),然后让前锋类、中锋以及后卫类去重载(override)。
class&Player
public&virtual&void&Attack(){}
public&virtual&void&Defense(){}
class&Forward:Player
public&override&void&Attack(){//前锋的进攻}
public&override&void&Defense(){//前锋的防守}
class&Center:Player
public&override&void&Attack(){//前锋的进攻}
public&override&void&Defense(){//前锋的防守}
public&void&Rebound(){//抢板}
class&Guard:Player
public&override&void&Attack(){//前锋的进攻}
public&override&void&Defense(){//前锋的防守}
class&PlayerInvoke:Player
private&Player&_
public&PlayerInvoke(Player&player)
public&void&Attack()
_player.Attack();
public&void&Defense()
_player.Defense();
调用的时候
Player&player=new&Forward();
Player&player=new&Center();
Player&player=new&Guard();
PlayerInvoke&pi=new&PlayerInvoke(player);
pi.Attack();
这是简单工厂实际模式的简单应用,此时你要查看哪个位置运动员的防守、进攻不是灵活多了?而且,在增加其它位置的运动员时,易于扩展和维护。
因为他想偷懒所以想概述下
interface&IUSB
&&&void&Connect();
&&&void&Close();
&&&bool&SendByteToDevice(long&location,byte&b);
&&&byte&GetByteFromDevice(long&location);
class&MP3:IUSB
&&&&void&Connect()
&&&&&MessageBox.Show("MP3&Connected");
&&&void&Close()
&&&&MessageBox.Show("MP3&Removed&From&USB&Interface");
&&&&&bool&SendByteToDevice(long&location,byte&b)
&&&&&return&
&&&byte&GetByteFromDevice(long&location)
&&&&return&0;
class&Mouse:IUSB
&&&&void&Connect()
&&&&&MessageBox.Show("Mouse&Connected");
&&&void&Close()
&&&&MessageBox.Show("Mouse&Removed&From&USB&Interface");
&&&&&bool&SendByteToDevice(long&location,byte&b)
&&&&&return&
&&&byte&GetByteFromDevice(long&location)
&&&&return&0;
main(string[]&fucks)
&&&IUSB&usb=new&MP3();
&&&usb.Connect();
&&&usb.Close();
&&&usb=new&Mouse();
&&&&&&usb.Connect();
&&&&&&usb.Close();
上面的就是接口。
接口主要用于多态化方法。
class&BaoMaCar
&&&AbLunTai&LunTai=&new&BaoMaLunTai();
&&&void&runLongTime(){}
abstract&class&AbLunTai&
&&&string&Name="AbLunTai";
class&BaoMaLunTai
string&Name="BaoMaLunTai";
class&OOOOLunTai
string&Name="OOOOLunTai";
main(string[]&gays&)
&&&BaoMaCar&car=new&BaoMaCar();
&&&car.runLongTime();
&&&car.LunTai=new&OOOOLunTai();
这就是抽象类,多用于多态对象。
2、抽象基类:实现代码复用
人分男人和女人,不论男人女人都有吃饭(这就是共性,当然还有很多其它共性),但是男人和女人有其它行为是不一样的(比如上厕所的方式,^_^低俗)..这时候可以把男人和女人的共性拿出来,然后使用集成,这样男人女人类都复用这些代码。
abstract&class&Person
public&void&Eating()
{//人吃饭}
public&virtual&void&WC()
//男人和女人类重写
class&Female:Person
public&override&void&WC(){}
class&Male:Person
public&override&void&WC(){}
帮顶,学习
3、接口:面向接口编程模式、适配器模式等
接口表示调用者和设计者的一种约定,在多人合作开发同一个项目时,事先定义好相互调用的接口可以大大提高开发的效率。接口是用类来实现的,实现接口的类必须严格按照接口的声明来实现接口提供的所有功能。有了接口,就可以在不影响现有接口声明的情况下,修改接口的内部实现,从而使兼容性问题最小化。
当其他设计者调用了接口后,就不能再随意更改接口的定义,否则项目开发者事先的约定就失去了意义。但是可以在类中修改相应的代码,完成需要改动的内容。
抽象类是指这个类是不完全可用的,只能作为其它类的基类。抽象类和其它非抽象类的最大区别之处在于:抽象类不能被实例化。
1)&抽象类和接口都不能被实例化
2)接口是完全抽象的成员集合;抽象类可以完全实现,也可以部分实现或者根本不实现,从而封装继承类的通用功能
3)&抽象类只能作为基类使用,接口可以从其它基接口继承
4)接口成员默认访问方式是public,接口成员定义不能包含任何访问修饰符;抽象类则不然
5)&接口中不能声明任何种类的静态成员,抽象类则可以
6)&接口成员必须只能是方法、属性、索引器和事件,且不提供实现;抽象类还可以声明字段以及实现的方法和属性等
7)&抽象方法只能在抽象类中声明
现在我这样理解了:
想了下,不管是接口还是抽象类,多态只是他的一个表现,不是目的。
搭建框架的时候,层之间调用我用接口去实现(解耦)。也像书面说的“约定”
如12楼说“接口只是对某一类事物行为的规范”。意思这层的某个类只可以调用上一层哪些方法或属性,因为我调用的是一个接口,接口只告诉我可以使用哪些方法。
提供外部调用的时候,我提供一个接口,可以保护的作用,保护一些其他方法或者属性不被调用。
子类继承它,就必须实现它的抽象方法。我们把共同的属性或者方法,写到一个抽象类里面,这样,我们再写一个类的时候,我就发现不需要重新写这个,看看他属于哪一个类型,直接继承这个类型。
因为只能继承一个类,所以要用接口,可以实现多个接口的继承。
有个不理解的地方,在代码的重用方面的。
抽象类里面的抽象方法还是接口里面的方法,都没有任何的实现的。我到底重用了什么?
18楼说:“这样我在操作的时候可以采用一个递归的方法,不需要关心我现在处理什么,只有到实现具体操作的时候才判断要做什么,这样可以节省很多代码,而且结构也很简单”
我想这个我们只是提供了一个方法让我们重写。并不存在重用了。。。
是不是感觉这样定义接口或者是抽象类,在重写方面,感觉还不如继承一个普通的类,可以调用父类的方法,我也可以重写它的。。?
现在感觉还是停留在,3楼那个理解。
看看设计模式就知道为啥要的
这个说来话长了。得从c++那辈子说起了。
话说c++程序员是没有这两个关键字的,所有的多态都是virtual,但是情况一多一复杂就很难办了,c++程序员不得不在自己的代码里玩“意大利面条”,纯虚函数,base.base.method(),这样使代码非常难读难调试
所以后面的java和c#才特意规定了&这两个关键字,他就是一种限定,能让程序员更清楚的限定自己的代码
上面是语法的历史。
如果说实际意义,我们就的说哲学了。&按老外们的头脑认为,程序实际就是现实对象在头脑中的反映,是抽象的,形而上学的。抽象的东西是基石,就像原子和分子,老外说物质是原子和分子组的,所以他们更倾向于构建原子和分子&及规则。
相比来说&抽象类&就是&物质对象在头脑中的那个&物理或化学模型
而接口则通常是物质或化学模型里的&规则体现。
比如化学:苯环系列的东西在物质上可以被抽象成,苯环的抽象类。而苯环系列物质所体现的物理或化学特性则可以被当做接口规则去体现
关于重用:
&&&&&&&&&&&&&&&&LunTai&dai&=&new&BaoMaLuntai();
&&&&&&&&&&&&Console.WriteLine(dai.size);
&&&&public&abstract&class&LunTai&
&&&&&&&public&int&size&=&50;
&&&&public&class&BaoMaLuntai&
&&&&public&class&OOOOLuntai&
这个一直搞不懂。。。
引用&31&楼&angel6709&的回复:关于重用:
& & & & & & & &LunTai&dai&=&new&BaoMaLuntai();
& & & & & &Console.WriteLine(dai.size);
& &public&abstract&class&LunTai
& & &public&int&size&=&50;
& &public&class&BaoMaLuntai:LunTai//wang&le
& &public&class&OOOOLuntai:LunTai
东西是老外整的,所以我们用老外的脑袋去看就成
回想一下高中化学,那个元素周期律
一价氢氯钾钠银&&他们是一个家族的,所以他们被放到了“一价”元素这个抽象类里面,这就是抽象类的作用
然后我们在看他们的特性和规则。
酸性、碱性、可燃性、氧化性、还原性、热稳定性等&这些是规则和特性,所以这些东西我们则使用接口去限定他们
可以说是代码的重用,许多对象具备一些相同的功能,不可能
给每个类再分别定义一次这些函数嘛?
那太麻烦了啊!
所以有借口,抽象类,作为共享资源!
我们简单还原一下&一价元素氢的实现
&&接口&酸碱性接口
&&string&酸碱性&
&&抽象类&一价元素:酸碱性接口&&//抽象类继承酸碱性接口,以实现一价元素通用特性
&&&&string&酸碱性&{return&“弱酸”}
&&元素类&氢:一价元素,酸碱性接口&//继承一价元素和酸碱性接口,并显示实现酸碱性接口,以实现氢元素独立的酸碱特性
&&&string&酸碱性接口.酸碱性{return&"氢的ph值是xxxx"}
&不顶不行吖。。关注
抽象和接口的目的是为了解耦,让一大块变成一个一个的小块
解耦的目的是为了修改一处不影响另一处或整体(比如修改此一处要必须修改其它地方十余处,所谓的可维护)
如果把其中的一小块拿到其它地方也许也可以使用呢(所谓的可重用)
如果要添加新的功能,实现这个接口或者继承这个抽象类弄出一小块来插进去就可以用(所谓的可扩展),为什么一插进去就可以用呢?因为这些小块都有共同的抽象类或者接口,在调用方看来,这些小块是一样一样的
楼主解决没?我也很想知道,希望分享
&#xe60a;回复
即使是一小步也想与你分享}

我要回帖

更多关于 字符串占几个字节 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信