<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>
组件编程技术
组件
把庞大的应用程序分割成多个模块,每个模块完成独立的功能,模块之间协同工作,这样的模块叫组件.
接口
接口描述了组件对外提供的服务.在组件和组件,组件和客户之间都是通过接口进行交互,组件接口一旦发布,就尽量不要再修改接口,任何对接口修改的改变都有可能造成组件与客户的联系遭到破坏.
接口定义
从技术上讲,接口是一组包含了函数型方法的数据结构
.
通过这组数据结构,可以代码可以调用组件对象的功能.
接口的定义可以使用以下修饰符
New ,public,private,protected,internal
在接口定义时同一修饰符不能出现多次,new 修饰符只出现在嵌套接口中,表示覆盖了继承而来的成员名
.
在接口的声明中可以定义接口的成员,接口成员可以是,方法,属性,索引指示器,事件.
例
interface IControl
{
void Pain();
}
声明了一个接口IControl,定义了一个成员方法Pain
接口的继承
接口具有不变性,但不意味着接口不再发展,类似于类的继承性,接口也可以继承和发展
值得注意的是,接口的继承和类的继承不一样.
1,
类的继承不仅是说明继承,而且是实现继承,而接口继承只是说明继承,也就是说,派生类可以继承基类的方法实现,而派生类的接口只继承了父接口的成员方法说明,而没有继承父接口的实现
2,C#
只允许类单继承,但接口允许多继承,一个子接口可以有多个父接口
被继承的接口必须是可以访问的到的,接口不允许直接或间接的从自身继承
interface
IControl
{
void Pain();
}
interface TextBox:IControl
{
void SetText( string text);
}
interface IComboBox:IControl,TextBox
{}
{
void Pain();
}
interface TextBox:IControl
{
void SetText( string text);
}
interface IComboBox:IControl,TextBox
{}
接口IComboBox同时从IControl,TextBox中继承,多继承用逗号分割
接口成员
接口可以定义一个或多个成员,这些成员可以是方法,属性,索引指示器,事件,但不能是常量,域,操作符,构造函数,析构函数,而且不能包含任何静态成员
接口成员的默认访问方式是public,接口成员声明不能包含任何修饰符,接口可以声明与继承而来的成员名字相同的成员,这样就直接覆盖了继承的成员,如果在声明时不加NEW则编译器会报错
对接口成员的访问
接口成员访问与类的访问一致,但由于支持多继承,会发生出现两个同名的父继承成员,产生二义性,这是需要显示的进行声明.
interface
ISequence
{
int Count
{
get;set;
}
}
interface IRing
{
void Count(int i);
}
interface IRingSequence:ISequence,IRing{}
class c
{
void test(IRingSequence rs)
{
((IRing)rs).Count(1);
((ISequence)rs).Count=1;
}
}
类C的方法test要访问接口IRingSequence的成员,必须先声明一个此接口的变量,然后显示指定具体继承的父属性的成员.
使用接口全名进行访问
直接用接口名.成员名进行访问,如果在命名空间内还需要包含命名空间名
,
例如
IControl.count;
Namespace.IControl.count
全名中的成员必须是在接口中声明过的,不能用继承而来的