程序集的依赖关系

felixz2010 2009-11-19 11:21:06
有 程序集 A B C

情况一:

在程序集A 中,编写 类base

在程序集B 中,编写 类Sub:base

在C中, 编写 类Application, 其中 实例化Sub

此时, ABC的引用关系为, B引用A, C引用A与B

情况二:

在程序集A 中,编写 类base

在程序集B 中,编写 类Sub, 其中 实例化 base

在C中, 编写 类Application, 其中 实例化Sub

此时, ABC的引用关系为, B引用A, C此时仅需引用B(而无需引用A)

这是,什么原理?


...全文
112 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
FlyinFish 2009-12-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 felixz2010 的回复:]
感谢 acqy 与 vrhero的回复

我仍有一点不明

在情况1中,类Base中,并没有 virtual 或 abstract 的方法

我又做了一个实验, 在Sub中我不覆盖任何父类的方法或属性

这时,编译器仍提示我需要应用A

这是什么原理呢?

谢谢
[/Quote]

在Sub中我不覆盖任何父类的方法或属性, 不代表不会继承Base的其他方法和属性.

例子:

public class Base
{
public MethodA()
{
Console.WriteLine("MethodA");
}
}

public class SubBase: Base
{
}


即使SubBase没有任何方法,当你实例话SubBase之后,还是可以调用SubBase.MethodA()的,这就是Inheritance/继承.

Abstract/Virtual的方法是OOP中的Polymorphism
acqy 2009-12-03
  • 打赏
  • 举报
回复
当然,我的例子中,只是告诉你,由于基类有可能会有virtual、abstract方法去让子类重写,因此客户端程序的assembly需要引用基类的assembly,这是为了让你能够简单明了地认识到这个问题。事实上在这里,用方法作例子并不可靠。
我觉得你有必要去了解一下,从CLR的角度,子类和基类的内存分配是什么样子的。比如基类中有个受保护成员,称为p,那么子类应该是共享了基类的这个p,而不是单独复制一份出来,于是子类与基类在p这个成员上就有了联系。这种联系并不仅仅是因为基类中有个p。
felixz2010 2009-12-03
  • 打赏
  • 举报
回复
感谢 acqy 与 vrhero的回复

我仍有一点不明

在情况1中,类Base中,并没有 virtual 或 abstract 的方法

我又做了一个实验, 在Sub中我不覆盖任何父类的方法或属性

这时,编译器仍提示我需要应用A

这是什么原理呢?

谢谢
vrhero 2009-11-21
  • 打赏
  • 举报
回复
因为第一种情况B和C都要用到A的元数据,而第二种情况只有B用到A的元数据...

不能理解的话就看3楼的解释,虽然没有说出根本原因不过比较容易理解...真正要理解去看看MSDN关于元数据的概念...
「已注销」 2009-11-20
  • 打赏
  • 举报
回复
记得好像都只引用B就可以了。B已经引用了A。
acqy 2009-11-20
  • 打赏
  • 举报
回复
我觉得应该是,因为在第一种情况下,Sub是Base的子类,那么Sub中就会有可能override(当Base中的方法为virtual时),或者implement(当Base中的方法为abstract时) Base中的方法,而这个方法的定义是在Base中的。然而,Application要用Sub,就必须要知道这些方法/属性等的定义,因此Application也要引用A。

第二种情况,由于Base是Sub的一个component,即使Sub中公布了Base对象的某些方法或者属性,那它也只不过是一个wrapper,即仅仅是将调用转发给自己肚子里的Base,这样一来,Application根本不需要知道Base的细节,因为它被Sub封装了。
felixz2010 2009-11-19
  • 打赏
  • 举报
回复
自己顶
很好的电子书教程! 什么是 Android? Android是一个专门针对移动设备的软件,它包括一个操作系统,中间件和一些重要的应用程序。Beta 版 的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • 成的浏览器 基于开源的 WebKit 引擎 • 优化的图形库 包括定制的2D 图形库,3D 图形库基于 OpenGL ES 1.0 (硬件加速可选) • SQLite SQLite SQLite SQLite 用作结构化的数据存储 • 多媒体支持 包括常见的音频、视频和静态图像格式 (如 MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF) • GSM GSM GSM GSM 电话技术 (依赖于硬件) • 蓝牙 Bluetooth, Bluetooth, Bluetooth, Bluetooth, EDGE, EDGE, EDGE, EDGE, 3G, 3G, 3G, 3G, 和 WiFi WiFi WiFi WiFi(依赖于硬件) • 照相机,GPS GPS GPS GPS,指南针,和加速度计(accelerometer accelerometer accelerometer accelerometer) (依赖于硬件) • 丰富的开发环境 包括设备模拟器,调试工具,内存及性能分析图表,和 Eclipse 成开发环境插件 应用程序 Android 会同一系列核心应用程序包一起发布,该应用程序包包括 email 客户端, SMS 短消息程序,日历, 地图,浏览器,联系人管理程序等。所有的应用程序都是使用 JAVA 语言编写的。 应用程序框架 开发人员也可以完全访问核心应用程序所使用的 API 框架。该应用程序的架构设计简化了组件的重用;任何 一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框 架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。 隐藏在每个应用后面的是一系列的服务和系统, 其中包括; • 丰富而又可扩展的视图( Views),可以用来构建应用程序, 它包括列表(lists),网格( grids), 文 本框(text boxes),按 钮 (buttons), 甚至可嵌入的 web 浏览器。 • 内容提供器(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或 者共享它们自己的数据 • 资源管理器(Resource Manager)提供 非代码资源的访问,如本地字符串,图形,和布局文件( layout files )。 • 通知管理器 (Notification Manager) 使得应用程序可以在状态栏中显示自定义的提示信息。 4 • 活动管理器( Activity Manager) 用来管理应用程序生命周期并提供常用的导航回退功能。 程序库 Android 包含一些 C/C++库,这些库能被 Android 系统中不同的组件使用。它们通过 Android 应用程序框架 为开发者提供服务。以下是一些核心库: • 系统 CCCC 库 - 一个从 BSD 继承来的标准 C 系统函数库( libc ), 它是专门为基于 embedded linux 的设备定制的。 • 媒体库 - 基于 PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持 静态图像文件。编码格式包括 MPEG4, H.264, MP3,AAC, AMR, JPG, PNG 。 • Surface Surface Surface Surface Manager Manager Manager Manager - 对显示子系统的管理,并且为多个应用程序提 供了2D 和3D 图层的无缝融合。 • LibWebCore LibWebCore LibWebCore LibWebCore - 一个最新的 web 浏览器引擎用,支持 Android 浏览器和一个可嵌入的 web 视图。 • SGL SGL SGL SGL - 底层的2D 图形引擎 • 3D3D3D3D libraries libraries libraries libraries - 基于 OpenGL ES 1.0 APIs 实现;该库可以使用硬件 3D 加速(如果可用)或者使用高 度优化的3D 软加速。 • FreeType FreeType FreeType FreeType -位图(bitmap)和矢量(vector)字体显示。 • SQLite SQLite SQLite SQLite - 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。 Android Android Android Android 运行库 Android 包括了一个核心库,该核心库提供了 JAVA 编程语言核心库的大多数功能。 每一个 Android 应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik 虚拟 机实例。Dalvik 被设计 成一个设备可以同时高效地运行多个虚拟系统。 Dalvik 虚拟机执行(.dex)的 Dalvik 可执行文件,该格式文 件针对小内存使用做了 优化。同时虚拟机是基于寄存器的,所有的类都经由 JAVA 编译器编译,然后通过 SDK 中 的 "dx" 工具转化成.dex 格式由虚拟机执行。 Dalvik 虚拟机依赖于 linux 内核的一些功能,比如线程机制和底层内存管理机制。 Linux Linux Linux Linux 内核 Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型 。 Linux 内核也同时作为硬件和软件栈之间的抽象层。 5 建立 Android Android Android Android 开发环境 ① 下载 JDK 5 or JDK 6 (JRE alone is not sufficient) ->安装->设置环境变量 JAVA_HOME CLASSPATH path ② 下载 Eclipse 3.3 (Europa), 3.4 (Ganymede) IDE for JAVA->解压 ③ 下载 Android SDK 解压-> path 里加入 SDK 包中的 tools 目录全路径 ④ 下载 ADT 0.8.0 解压 ⑤ 打开 Eclipse 安装 ADT 插件 Android Android Android Android 的系统架构 系统构架 6 支持的功能 + Application framework: 可重用的和可替换的组件部分,在这个层面上,所有的软件都是平等的。 + Dalvik virtul machine: 一个基于 Linux 的虚拟机。 + Integrated browser: 一个基于开源的 WebKit 引擎的浏览器,在应用程序层。 + Optimized graphics: 包含一个自定义的2D 图形库和基于 OpenGL ES 1.0 标准的3D 实现。 + SQLite: 数据库 + Media support: 通用的音频,视频和对各种图片格式的支持(MPEG4, H.264, MP3,AAC, AMR, JPG, PNG, GIF) + GSM Telephony: GSM 移动网络, 硬件支持。 + Bluetooth, EDGE, 3G, and WiFi: 都依赖于硬件支持。 + Camera, GPS, compass, and accelerometer: 都依赖于硬件支持。 + Rich development environment: 包含一套完整的开发工具,方便跟踪调试,内存检测和性能测试,而且 提供了 Eclipse 的插件。 最底层的是一个 Linux Kernel,加载了几个移动设备必要的系统驱动(这么说来 Android 基础系统是要以 GPL 发布了?不知道 34 家厂商的硬件开发商们是怎么样想的);上面是类库和 Runtime,绿色的类库部分可以看 到大名鼎鼎的 SQLite,这个软件甚至声称自己属于公共领域(比 MIT License 还要强 @@),字体 FreeType 是 BSD-style License 的,图形库 OpenGL ES 只需通过产品测试,无偿使用于产品。再向上看是应用层的东西 了,这里可以做的事情就非常多了,各个社区,各个厂家都可以参与进来。难怪 Android 的 sdk 可以 Apache License 发布了,对企业和开发人员友好啊。 那么 Google 自己的东西在哪里呢?没错,就是右边那个 runtime, 最吸引技术人员的就是这个 runtime(注意,这个才是 Android 的 核 心 )。Google 为它准备了一个虚拟机,叫 做 Dalvik。这个让人摸不着头脑的东西的到底是什么?从开发平台上我们清清楚楚地得到了答案:Java Android Android Android Android 学习方法 ① 了解什么是 Androi ② 建立开发环境 ③ 阅读 SDK 文档 ④ 背景知识 � Java � 面向对象 � 设计模式 � J2ME、Brew 、Symbian

13,190

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 分析与设计
社区管理员
  • 分析与设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧