探讨继承与实现(二)

前文 探讨继承与实现(一)  根据双鱼座的提示已经更新。很不巧,我也是双鱼座的。teeth_smile.gif由于水平有限,有什么不足还请大家指教。

2007年2月1日
http://www.cnblogs.com/birdshover/

目录:
一、抽象的产生
二、依赖抽象
三、抽象的损耗


一、抽象的产生

你不知道你要实现的是个什么东西,你能很好的抽象出来么?我不是天才,所以我是不能。如果是那些天才至少也要是白痴天才型的人才能在毫无根据的情况下,假设出真是的存在。尔后居然被伟人证实居然是真的。比如说那个什么××××猜想。tongue_smile.gif

我认为,抽象要么是在建立模型后的产物,要么是重构的结果。而抽象是为了解决程序未来面临的变动。但是你即便把实体抽象出来了,不使用也是没有效果的。而前人总结出经验如何使用这些抽象产物——依赖倒置(Dependence Inversion Principle)。讲的是:要依赖于抽象,不要依赖于具体。也就是经常说的面向接口编程。(这地方的接口是广义上的接口)

DIP.gif


图2.1 抽象的产生与运用

上图描绘了先是根据细节得出抽象描述,然后又把抽象描述运用于实例。从种看出,如果没有3,4两步,抽下是没有意义的。就好比先发现了电,然后发现两根电线能传输电,再后来把电器接在电线上。但是这样很麻烦,于是发明了插座。再把插座实际应用到流程中去。

假设公司装了一扇自动门,有人来会开,人走了就关上。
 1     public class Door
 2     {
 3         private bool HavaPeson = false;   //是否有人,默认没有。自动门,该状态会自动改变。
 4 
 5         public void Open()
 6         {
 7             if (HavaPeson)
 8                 Console.WriteLine("Opend");
 9         }
10 
11         public void Close()
12         {
13             if (!HavaPeson)
14                 Console.WriteLine("Closed");
15         }
16     }

我们把它抽象出来
1     interface IDoor
2     {
3         void Close();
4         void Open();
5     }

 1     public class Door : IDoor
 2     {
 3         private bool HavaPeson = false;
 4 
 5         public void Open()
 6         {
 7             if (HavaPeson)
 8                 Console.WriteLine("Opend");
 9         }
10 
11         public void Close()
12         {
13             if (!HavaPeson)
14                 Console.WriteLine("Closed");
15         }
16     }

但是这对我们好像并没有用。
这个时候公司又要装一扇门,手推才会开,不推自动关上。

二、依赖抽象

 1     public class Door2
 2     {
 3         private bool IsPush = false;
 4 
 5         public void Open()
 6         {
 7             if (IsPush)
 8                 Console.WriteLine("Opend");
 9         }
10 
11         public void Close()
12         {
13             if (!IsPush)
14                 Console.WriteLine("Closed");
15         }
16     }


Door2也实现了IDoor接口啊!
所以改成
public class Door2 : IDoor
{}

老总感觉这两扇门不错,所以要全大楼装上这样的门,并且采用电脑控制。
如果每个门一个控制端,那累也累死了。所以可以实现如下。

Door.gif


图2.2 抽象关系

就是让ControlDoor依赖于IDoor。代码如下:

 1     public class ContorlDoor
 2     {
 3         private IDoor[] door = new IDoor[100];
 4         private bool flag = false;      //判断门和人的关系状态
 5 
 6         public void CDoor(int i)
 7         {
 8             door[i] = (IDoor)new Door();
 9             Contorl(door[i]);
10         }
11 
12         public void CDoor2(int i)
13         {
14             door[i] = (IDoor)new Door2();
15             Contorl(door[i]);
16         }
17 
18         public void Contorl(IDoor d)
19         {
20             if (flag)
21                 d.Open();
22             else
23                 d.Close();
24         }
25     }

现在即使要加新的门,只要让新型号的门实现接口IDoor就可以了。当然,这地方使用接口而不是抽象类,是根据第一篇文章决定的。探讨继承与实现(一) 
至于使用抽象类也是一样的道理。

三、抽象的损耗

所谓有所得必有所失,灵活的架构必然会带来性能上的损耗。

损耗的第一点,大家应该都看出来了,就是类型转换。需要把类的实例转换成接口或者抽象类。而转换除了带来灵活以外,并没有其它的收获。
 1  public class Test : ITest
 2     {
 3 
 4         #region ITest 成员
 5         private int myint;
 6         private string s;
 7 
 8         public string otherStr
 9         {
10             get
11             {
12                 return s;
13             }
14 
15             set
16             {
17                 s = value;
18             }
19         }
20 
21 
22 
23         public int MyInt
24         {
25             get
26             {
27                 return myint;
28             }
29             set
30             {
31                 myint = value;
32             }
33         }
34 
35         public string MyStr()
36         {
37             return "myStr";
38         }
39 
40         #endregion
41 
42         public string OtherStr()
43         {
44             return otherStr;
45         }
46     }
 1     public interface ITest
 2     {
 3         int MyInt
 4         {
 5             get;
 6             set;
 7         }
 8 
 9         string otherStr { get;set;}
10         string MyStr();
11     }
1         static void Main(string[] args)
2         {
3             ITest it = (ITest)new Test();
4             Test t = (Test)it;
5             t.otherStr = "1";
6             it.otherStr = "2";
7             Console.WriteLine(t.OtherStr());
8             Console.ReadKey();
9         }
以上代码输出值 2

实例it不能使用方法OtherStr,而再转化回来后还能使用,证明内存种存在的是Test的实例。并没有因为ITest 没有OtherStr而砍掉。只是再it实例中屏蔽(简化)了我们的访问。

Translation.gif
图2.3 类的转换前后


从图中可以看出,转换只是给了我们一个望远镜,一面能看到很大的视野,一面看到的小。就和古人写的管中窥豹是一个道理吧。

而为什么输出的是2而不是1,那是因为类是引用类型。而转换后还是引用类型。it和t看似两个实例,实际上指向的是同一段内存地址,只是留给你的看台不一样。

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

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

相关文章

实现android应用程序自动化测试的批处理脚本,简单入手移动端并发自动化测试:Appium+Robot+ 批处理脚本...

一、前言好久没写帖子,去年晋升为 leader 之后工作比较忙,去年为团队的产品建立了一轮的移动端(Android&iOS)的自动化测试,到今天为止跑了将近半年,前期感觉还行,但随着用例的增加,执行自动化脚本的时间…

祝大家新年快乐

祝大家新年快乐!万事如意!衷心祝愿大家在新的一年里:所有的期待都能出现! 所有的梦想都能实现!所有的希望都能如愿!所有的努力都能成功! 感谢大家一直以来对博客园的支持与帮助!转载于:https://www.cnblogs.com/dudu/archive/2007/02/17/652131.html

android 重新启动应用程序,在AsyncTask完成后重新启动完整的Android应用程序

我编码的应用程序检查/ sdcard下的目录中是否有特殊的ZIP文件,如果没有,则开始下载并解压缩.即使是子目录,下载和解压缩也可以工作.但是我需要在完成后重新启动应用程序 – 这不起作用.起初我有一个特殊的活动“PreMainActivity.java”只是为了重新启动目的:import …

Castle学习之一:安装与环境设置

第一步,当然是下载了。我本来下载的是Castle RC2的MSI安装文件,并通过SVN下载了Generator,但是安装后发现了一些问题(主要是.net版本的问题),所以删除了之后,从SVN下载了全部最新的代码&#xf…

android可以有一个悬浮窗口在进入屏保状态显示,点击进入应用,Android如何实现锁屏状态下弹窗...

前言想在锁屏上面实现弹窗,第一个想法就是利用 WindowManager设置 Window的 Flag,通过设置 Flag的显示优先级来让窗口显示在锁屏的上面。接下来就是试验可能相关的 Window Type属性,验证该方案是否可行。在尝试各个 Window Type 属性之前需要…

C# 调用 *.sql 文件

源&#xff1a;http://zhidao.baidu.com/question/5367984.html?si2using System; using System.Xml; using System.Data; using System.IO; using System.Collections; using System.Data.SqlClient; namespace ExecuteSqlFile { /// <summary> /// DBAccess 的摘要说明…

next按钮源码android,Android Edittext 软键盘输入法回车键改成下一步Next

软件盘中回车键默认功能是换行&#xff0c;但是有时候我们在Edittext中输完内容后点回车想要把焦点切到下一个Edittext继续输入&#xff0c;比如常见的登录页面&#xff0c;在输完用户名后&#xff0c;点回车调到输入密码输入框继续输入。示例代码代码很简单&#xff0c;如下所…

获取周的日期范围

/*** 获取周的日期范围* param string $week* param string $year* return array*/ public static function getWeekDate($week ,$year ) {/*** 2007年 第一周 是 01-01 到 01 - 07 因为第一天就是星期一 6* 2008年 第一周 是 01-01 到 01 - 06 因为第一天就是星期二 5 (闰年…

SQL SERVER 2005 T_SQL新的特性以及解决并发

一.修改语句的增强UPDATE test SET tname.WRITE(one hundred and two, 9, 3) WHERE tid 102在2005中增强了update方法&#xff0c;这是修改test表的列tname WRITE方法是把tname这个列中从字符串9开始 把3个长的字符串改为one hundred and two二、异常的捕获可以捕获过去会导致…

f5+big+client+android,F5负载均衡 MIBs bigip oid

F5 MIBs分组bigip-ltmpool-statoid".1.3.6.1.4.1.3375.2.2.5.2.3.1.1" name"ltmPoolStatName" smi-type"string"oid".1.3.6.1.4.1.3375.2.2.5.2.3.1.2" name"lPSServerPktsIn" smi-type"Counter"oid".1.3.6.…

Firefox: Connection Interrupted | The connection to the server was reset while the page was loading

http://blog.tangcs.com/2008/11/28/firefox-connection-interrupted/转载于:https://www.cnblogs.com/WarrenTang/archive/2008/11/28/1343580.html

用dw(dreamweaver)开发asp.net,连接数据库时出现“http错误500,服务器内部错误”的解决方法...

前几天在用dreamweaver开发asp.net时&#xff0c;需要用到datagrid&#xff0c;但是在用dw的“应用程序/数据库”面板进行数据库连接时&#xff0c;老是弹出对话框&#xff1a;“http错误500&#xff0c;服务器内部错误”&#xff0c;无法连接数据库&#xff0c;搞了几天都没有…

android跑分和ios,手机:苹果VS安卓 跑分不代表手机流畅度

原标题&#xff1a;手机&#xff1a;苹果VS安卓 跑分不代表手机流畅度在当前的国内手机市场中&#xff0c;有两个阵营&#xff1a;安卓和苹果。 安卓系统仍然是使用最多的系统。从最初的128M内存到当前的十多GB内存&#xff0c;安卓手机已得到迅速发展和更新。但总体而言&#…

【转载】给程序员的圣诞大礼★★春夏

计算机寓言之春真爱与新生 1 两名学生 曾经有一名学生&#xff0c;他在课余时间里穿上古时侯的盔甲&#xff0c;随后他如今那些和他有类似想法的人在一起&#xff0c;模仿古代社会里的贵州和太太们。 另一名学生是计算机科学专业的&#xff0c;他问一名学生为什么要穿着奇装异服…

html5 打开网页自动全屏,HTML5实现浏览器播放全屏模式!

先写点css样式&#xff1a;*{margin:0;padding:0}.btn1{position:absolute;right:0;bottom:0;z-index:23;}.div1{position:relative;z-index:1;width:423px;height:230px;}这是全屏的封装函数&#xff1a;function aaa(element){if(element.requestFullscreen){element.reque…

Proxy(Chapter 22 of Pro Objective-C Design Patterns for iOS)

You’d naturally think about using the pattern when? You need a remote proxy that provides a local representative for an object in a different address space or in the network.? You need a virtual proxy to create heavy-weighted objects on demand. We will …

余宏德:Sun所有的核心技术都是开放的

3月30日上午&#xff0c;“Sun 2007年媒体论坛”在香港举办。时值Sun公司成立25周年&#xff0c;因此本次活动备受大家关注。Sun公司大中华区管理层和技术专家与40家左右的媒体记者进行了面对面的讨论。本次活动的主题是“创新共享成长&#xff0d;为社会进步而创新”&#xff…

html打开自动点击,如何把一段JS点击触发改为页面打开后就自动触发?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼1、最简单的调用方式直接写到html的body标签里面&#xff0c;如&#xff1a;2、在JS语句调用function func(){……}window.οnlοadfunc;3、同时 调用多个函数直接写到html的body标签里面,如&#xff1a;4、js调用多个函数,以下这种…

图示/白话 execve执行流程

转载于:https://www.cnblogs.com/image-eye/archive/2011/07/13/2105411.html

转pbr随笔

光的基本传递模型]1 在一个要渲染的场景中&#xff0c;我们认为光能由预先指定的光源发出&#xff0c;然后我们以光线来描述光能的传递过程&#xff0c;当整个场景中的光能信息被我们计算出来后&#xff0c;我们收集这些信息转化为顶点的亮度。2 光线经过物体表面可以产生反射和…