.netjava编写一个接口参数

豆丁微信公众号
君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
Java调用.net的webservice接口对方无法获得参数解决思路
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口51CTO旗下网站
VB.NET接口范例ISpeak
本文提供的VB.NET接口范例希望能为读者建立起对接口一个初步的、正确的认识。本例定义了一个名为 ISpeak 的接口,其中包括了三个签名。
作者:NBWD来源:网络转载| 16:38
我有一个朋友,他学习 VB.NET 时间还不是很长。这几天,他对面向对象编程中的接口突然产生了很大的兴趣。为了帮助他让他能够对接口有一个初步的、正确的认识,我写了下面的例子。同时,希望本例对目前还不是很了解接口的朋友有所帮助。
VB.NET接口范例
在这个例子中,我定义了一个名为 ISpeak 的接口,它其中包括了三个签名(请参见下面程序)。由于接口是代表一种约定或者说是一种规则,它并不包含这种约定或者规则的具体实现。所以,我们只需要在接口中定义签名即可。在该接口中,包括了三个成员签名,它们分别代表了属性、方法以及函数。
接下来,我又定义了三个类,分别是 Baby、Children 和 Adlut ,这个三类都实现了上述接口。并且,在每个类实现接口的成员时,都给出了具体的实现。
来看代码:&Public&Interface&ISpeak &&&&&&&&&&ReadOnly&Property&CanSpeak()&As&Boolean&&&&&&&&&&&&&&&&&&&&Sub&Speak()&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Function&GetSpeakLevel()&As&SpeakLevelEnum&&&&&&&&&&&End&Interface&&&Public&Enum&SpeakLevelEnum &&&&&Bad&&&&&&&&&&Ordinary&&&&‘一般 &&&&&Fluent&&&&&&&&&End&Enum&&Public&Class&Baby&:&Implements&ISpeak&&&&&&&&&&&&&&&&&&&&&&&Public&ReadOnly&Property&CanSpeak()&As&Boolean&Implements&ISpeak.CanSpeak &&&&&&&&&Get&&&&&&&&&&&&&Return&False&&&&&&&&&End&Get&&&&&End&Property&&&&&&Public&Function&GetSpeakLevel()&As&SpeakLevelEnum&Implements&ISpeak.GetSpeakLevel &&&&&&&&&Return&SpeakLevelEnum.Bad &&&&&End&Function&&&&&&Public&Sub&Speak()&Implements&ISpeak.Speak &&&&&&&&&Console.WriteLine("(旁白):他是一个婴儿,还不会说话。") &&&&&End&Sub&End&Class&&Public&Class&Children&:&Implements&ISpeak &&&&&Public&ReadOnly&Property&CanSpeak()&As&Boolean&Implements&ISpeak.CanSpeak &&&&&&&&&Get&&&&&&&&&&&&&Return&True&&&&&&&&&End&Get&&&&&End&Property&&&&&&Public&Function&GetSpeakLevel()&As&SpeakLevelEnum&Implements&ISpeak.GetSpeakLevel &&&&&&&&&Return&SpeakLevelEnum.Ordinary &&&&&End&Function&&&&&&Public&Sub&Speak()&Implements&ISpeak.Speak &&&&&&&&&Console.WriteLine("哈哈,我是一个快乐的孩子!") &&&&&End&Sub&End&Class&&Public&Class&Adult&:&Implements&ISpeak &&&&&&Public&ReadOnly&Property&CanSpeak()&As&Boolean&Implements&ISpeak.CanSpeak &&&&&&&&&Get&&&&&&&&&&&&&Return&True&&&&&&&&&End&Get&&&&&End&Property&&&&&&Public&Function&GetSpeakLevel()&As&SpeakLevelEnum&Implements&ISpeak.GetSpeakLevel &&&&&&&&&Return&SpeakLevelEnum.Fluent &&&&&End&Function&&&&&&Public&Sub&Speak()&Implements&ISpeak.Speak &&&&&&&&&Console.WriteLine("OK,&我是成年人了,不但能流利地说母语,还会说外语。") &&&&&End&Sub&End&Class&&&&Public&Class&AppStart &&&&&Shared&Sub&Main() &&&&&&&&&Dim&person1&As&New&Baby &&&&&&&&&Dim&person2&As&New&Children &&&&&&&&&Dim&person3&As&New&Adult &&&&&&&&&&person1.Speak() &&&&&&&&&person2.Speak() &&&&&&&&&person3.Speak() &&&&&&&&&&If&person2.GetSpeakLevel&&&SpeakLevelEnum.Bad&Then&&&&&&&&&&&&&Console.WriteLine("&Person2&的说话水平不算很差") &&&&&&&&&End&If&&&&&&&&&&If&person1.CanSpeak&Then&&&&&&&&&&&&&Console.WriteLine("&Person1&会说话") &&&&&&&&&Else&&&&&&&&&&&&&Console.WriteLine("&Person1&不会说话") &&&&&&&&&End&If&&&&&&&&&&Console.Read() &&&&&End&Sub&End&Class&&
在 VS 中建立一个“控制台项目”项目,将默认的 Module1.vb 删除,在该项目中添加一个类,将上述代码复制到这个类中覆盖原有内容,即可运行调试。
VB.NET接口范例学习经验
关于接口,学习总结如下:
1、定义接口名,应按照惯例,将接口名的第一个字母命名为 I,如上例中的 ISpeak,这样做的目的是见名知义,原因是因为接口的英语单词是 Interface;
2、由于接口中的成员签名必须在实现该接口的类中给出其具体实现,所以它们前面不用加访问级别修饰符(Public、Privated 等);
3、类通过 Implements 关键字实现接口;
4、一个类要实现一个接口,就必须实现该接口中定义的所有成员签名;
5、一个类可以实现多个接口,方法是在接口名用“,”隔开,如 Implements ISpeak,IRun。
以上是一个简单易懂的VB.NET接口范例,以及学习心得。
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
关注头条热点头条热点
24H热文一周话题本月最赞
讲师:228266人学习过
讲师:83450人学习过
讲师:15042人学习过
精选博文论坛热帖下载排行
《网管员必读――网络组建(第2版)》仍是以一个中等规模的模拟局域网组建为思路,较全面地介绍了与局域网组建相关的各方面知识和组建、配...
订阅51CTO邮刊& &年关将近,整个人已经没有了工作和写作的激情,估计这个时候很多人跟我差不多,该相亲的相亲,该聚会喝酒的聚会喝酒,总之就是没有了干活的心思(我有很多想法,但就是叫不动我的手脚,所以我只能看着别人在做我想做的事,吃我想吃的东西。)。本人由上个月的每周四五篇,到现在的文章缩短到每周一篇,说个实话,现在的一篇也有不想写的心思了(这一篇还是咬着牙写的,感觉实在是写不动了,写博客太折腾人了,谁写谁知道啊!),不过还是希望写出来可以帮到大家,如有写的不足的地方,还望大家多多指正,知识在于总结和反思,对别人也对自己都是一个提高。 &
& &这里先来一段废话,缓和一下气氛,免得让大家很尴尬(太直接了还是不太好,总不能见到喜欢的女生就表白吧,还得多多的相处,让人觉得你稳重有深度。),现在进入我们今天的博客内容,那就是.NET的参数用法。因为在.NET的参数用法和约束特别多,对于很多初学者来说,这样繁多的参数用户简直就是跟扯淡一样,即使对于是拥有丰富经验的开发者来说,也未必能够很轻松使用所有的参数用法和选择合适的参数类型。谈到参数,估计很多人就只是想着我们在一般的方法调用中使用的那样,如string,int,object等等类型,更多的也就没有了印象,就是知道,也就是在遇到了再去查看一下,这样其实也没错,毕竟不能话费过多的时间用在哪些不常用的知识上,但是我个人觉得对于知识还是需要提前有一个全面的学习,可能具体的细节不能很好的把握,但是对于全局的概念还是得有一个整体的学习。
& &下面就简单的介绍一下.NET的一些常用参数用法,如有不足还望指正,也欢迎大家在下面留言讨论,分享自己的见解。
一.DotNet参数概述:
& & .NET中参数(形式参数)变量是方法或索引器声明的一部分,而实参是调用方法或索引器时使用的表达式。
& & 在CLR中,默认的情况下所有的方法参数都是传值的。在传递引用类型的对象时,对一个对象的引用会传递给方法。这里的船引用本身是以传值的方式传给方法的。这也意味着方法能够修改对象,而调用者能看到这些修改。对于值类型的实例,传给方法的实例的一个副本。意味着方法将获得它专用的一个值类型实例副本,调用者中的实例不受影响。
& & 在CLR中允许以传引用而非传值的方式传递参数,在C#中使用out和ref来实现传递引用的方式传值。在C#中使用out和ref来实现传递引用的方式传值,这两个关键字告诉编译器生成元数据来指明该参数是传引用的,编译器将生成代码来传递参数的地址,而不是传递参数本身。为值类型使用out和ref,效果等同于以传值的方式传递引用类型。& &
& & 常用的参数主要有基本类型参数,泛型参数,以及&in T&和&out T&,dynamic等等。例如&in T&和&out T&,在CLR中支持泛型类型的可变性,C#在4.0时获得了生命泛型遍体所必须的语法,并且现在编译器也能够知道接口和委托可能的转换。可变性是以一种类型安全的方式,讲一个对象作为另一个对象来使用。可变性应用于泛型接口和泛型委托的类型参数中。协变形用于向调用者返回某项操作的值;逆变性是指调用者想API传入值;不变性是相对于协变性和逆变性,是指什么也不会发生。对于这方面的知识非常的丰富,有兴趣的可以自行了解,这里就不做详细的介绍了。dynamic类型,C#是一门静态类型的语言,在某些情况下,C#编译器要寻找特定的名称而不是接口。dynamic可以在编译时做任何事,到执行时再由框架进行处理。有关动态类型的介绍也不做更深入的介绍。
& & 在.NET中参数的使用方法主要为可选参数、命名参数、可变数量参数等等。本文下面也是主要介绍这三种参数的使用方法。
二.DotNet参数用法:
& & 以下是主要介绍三种参数的用法:可选参数;命名实参;传递可变数量的参数。 &&
& &1.可选参数:
& & &(1).基本用法:
& & & & 如果某个操作需要多个值,而有些值在每次调用的时候又往往是相同的,这时通常可以使用可选参数。在C#以前实现可变参数的功能,往往声明一个包含所有可能参数的方法,其他方法调用这个方法,并传递恰当的默认值。
& & & & 在可选参数中,设计一个方法的参数时,可以为部分或全部参数分配默认值。在调用这些方法代码可以选择不指定部分实参,接受默认值。还可以在调用方法时,还可以通过指定参数名称的方式为其传递实参。如下实例:
static void OptionalParameters(int x, int y = 10, int z = 20)
Console.WriteLine("x={0} y={1} z={2}",x,y,z);
OptionalParameters(1, 2, 3);
OptionalParameters(1, 2);
OptionalParameters(1);
& & &以上的例子可以很清楚的看到其用法,int y=10和int z=20这两个参数就是可选参数。可选参数的使用中,如果调用时省略了一个参数,C#编译器会自动嵌入参数的默认值。向方法传递实参时,编译器按从左向右的顺序对实参进行求值。使用已命名的参数传递实参时,编译器仍然按照从左到右的顺序对实参进行求值。
& & & (2).基本原则:
& & & &可选参数包含一些规范,具体的一些要求如下:
    (a).所有可选参数必须出现在必备参数之后,参数数组(使用params修饰符声明)除外,但他们必须出现在参数列表的最后,在他们之前是可选参数。
    (b).参数数组不能声明为可选的,如果调用者没有指定值,将使用空数组代替。
    (c).可选参数不能使用ref和out修饰符。
    (d).可选参数可以为任何类型,但对于指定的默认值却有一些限制,那就是默认值必须为常量(数字或字符串字面量、null、const成员、枚举成员、default(T)操作符)。
    (e).指定的值会隐式转换为参数类型,但是这种转换不能是用户定义的。
    (f).可以为方法、构造器、有参属性的参数指定默认值,还可以为属于委托定一部分的参数指定默认值。
    (g).C#不允许省略逗号之间的实参。
& & & 在使用可选参数时,对于引用类型使用null来做默认值,如果参数类型是值类型,只需要使用相应的可空值类型作为默认值。
& & & (3).代码示例:
/// &summary&
/// 提取异常及其内部异常堆栈跟踪
/// &/summary&
/// &param name="exception"&提取的例外&/param&
/// &param name="lastStackTrace"&最后提取的堆栈跟踪(对于递归), String.Empty or null&/param&
/// &param name="exCount"&提取的堆栈数(对于递归)&/param&
/// &returns&Syste.String&/returns&
public static string ExtractAllStackTrace(this Exception exception, string lastStackTrace = null, int exCount = 1)
while (true)
const string entryFormat = "#{0}: {1}\r\n{2}";
lastStackTrace = lastStackTrace ?? string.E
lastStackTrace += string.Format(entryFormat, exCount, ex.Message, ex.StackTrace);
if (exception.Data.Count & 0)
lastStackTrace += "\r\n
lastStackTrace = exception.Data.Cast&DictionaryEntry&().Aggregate(lastStackTrace, (current, entry) =& current + $"\r\n\t{entry.Key}: {exception.Data[entry.Key]}");
//递归添加内部异常
if ((ex = ex.InnerException) == null) return lastStackT
exception =
lastStackTrace = $"{lastStackTrace}\r\n\r\n";
exCount = ++exC
& &2.命名实参:
& & & & &以上讲解了可选参数的一些基本概念和用法,接下来看一下命名参数的相关操作用法:
& & &&(1).基本用法:
& & & & & 命名实参是指在指定实参的值时,可以同时指定相应的参数名称。编译器将判断参数的名称是否正确,并将指定的值赋给这个参数。命名参数在各个实参之前加上它们的参数名称以及一个冒号。如下代码:
new StreamWriter(path:filename,aooend:true,encoding:realEncoding);
&如果要对包含ref和out的参数指定名称,需要将ref和out修饰符放在名称之后,实参之前。
bool success=int.TryParse("10",result:out number);
& & &&(2).基本原则:
& & & & 在命名参数中,所有的命名参数必须位于位置实参之后,两者之间的位置不能改变。位置实参总是指向方法声明中相应的参数,不能跳过参数之后,在通过命名相应位置的实参来指定。实参仍然按编写顺序求值,即使这个顺序有可能会不同于参数的声明顺序。
& & & & 在一般情况下,可选参数与命名实参会一起配合使用。可选参数会增加适用方法的数量,而命名实参会减少使用方法的数量。为了检查是否存在特定的适用方法,编译器会使用位置参数的顺序构建一个传入实参的列表,然后对命名实参和剩余的参数进行匹配。如果没有指定某个必备参数,或某个命名实参不能与剩余的参数相匹配,那么这个方法就不是适用的。
& & & &命名实参有时可以代替强制转换,来辅助编译器进行重载决策。如果方法是从模块的外部调用的,更改参数的默认值是具有潜在的危险的。可以按名称将实参传给没有默认值的参数,但是编译器要想编译代码,所有要求的实参都必须传递。
& & && 在写C#代码与COM对象模型进行互操作时,C#的可选参数和命名参数功能是最好用的,调用一个COM组件时,为了以传引用的方式传递一个实参,C#还允许省略REF/OUT,在嗲用COM组件时,C#要求必须向实参应用OUT.REF关键字。& &&
& &3.传递可变数量的参数:
& & & 在项目开发中,有时我们需要定义一个方法来获取可变数量的参数。可以使用params,params只能应用于方法签名中的最后一个参数。params关键字告诉编译器向参数应用System.ParamArrayAttribute的实例。我们具体看一下实现的代码:
[AttributeUsage(AttributeTargets.Parameter, Inherited=true, AllowMultiple=false), ComVisible(true), __DynamicallyInvokable]
public sealed class ParamArrayAttribute : Attribute
// Methods
[__DynamicallyInvokable]
public ParamArrayAttribute();
[__DynamicallyInvokable]
public ParamArrayAttribute()
& & &以上的代码可以看出该类继承自Attribute类,对于Attribute类可能不会陌生,那就是定义定制属性的基类,说明ParamArrayAttribute类用于定义定制属性,ParamArrayAttribute类在System命名空间下,ParamArrayAttribute类只有一个构造方法,没有具体的实现。AttributeUsage也定义了属性的使用方式。
& & C#编译器检测到一个方法调用时,会检查所有具有指定名称、同时参数没有应用ParamArrayAttribute的方法。如果找到一个匹配的方法,编译器生成调用它所需的代码。如果编译器没有找到一个匹配的方法,会直接检查应用ParamArrayAttribute的方法。如果找到一个匹配的方法,编译器会先生成代码来构造一个数组,填充它的元素,再生成代码来调用选定的方法。
& & 调用一个参数数量可变的方法时,会造成一些额外的性能损失,数组对象必须在对上分配,数组元素必须初始化,而且数组的内存最终必须垃圾回收。
& & 提供一个方法代码,仅供参考:
/// &summary&
/// 字符型二维数组转换成DataTable
/// &/summary&
/// &param name="stringDyadicArray"&&/param&
/// &param name="messageOut"&&/param&
/// &param name="dataTableColumnsName"&&/param&
/// &returns&&/returns&
public DataTable DyadicArrayToDataTable(string[,] stringDyadicArray, out bool messageOut,
params object[] dataTableColumnsName)
if (stringDyadicArray == null)
throw new ArgumentNullException("stringDyadicArray");
var returnDataTable = new DataTable();
if (dataTableColumnsName.Length != stringDyadicArray.GetLength(1))
messageOut = false;
return returnDataT
for (var dataTableColumnsCount = 0;dataTableColumnsCount & dataTableColumnsName.LdataTableColumnsCount++)
returnDataTable.Columns.Add(dataTableColumnsName[dataTableColumnsCount].ToString());
for (var dyadicArrayRow = 0; dyadicArrayRow & stringDyadicArray.GetLength(0); dyadicArrayRow++)
var addDataRow = returnDataTable.NewRow();
for (var dyadicArrayColumns = 0; dyadicArrayColumns & stringDyadicArray.GetLength(1);dyadicArrayColumns++)
addDataRow[dataTableColumnsName[dyadicArrayColumns].ToString()] = stringDyadicArray[dyadicArrayRow, dyadicArrayColumns];
returnDataTable.Rows.Add(addDataRow);
messageOut = true;
return returnDataT
&& 以上给出了一个使用可变参数数量以及命名参数的使用样例,完成了将二维字节数组转化为DataTable对象,将数组进行遍历,并将数组写入datatable中,对于整个方法的逻辑就不做深入介绍,代码比较的简单。
三.与参数有关的一些指导原则:
& & 声明方法的参数类型时,应尽量指定最弱的类型,最好是接口而不是基类。
&&& 在设计模式的基本原则中,迪米特法则也较最少知识原则,迪米特法则是指如果两个类不必彼此直接通信,那么这两个类就不应当直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。在类结构的设计上,每一个类都应当尽量降低成员的访问权限。类之间的耦合度越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。
&&& 对于参数的使用中,我们在对参数类型的使用上,还是需要很仔细和认真的去思考,因为在参数类型的定义上,在一定程度上影响着我们程序的扩展性和稳定性,如果参数类型的约束比较大,对于后续方法的扩展,意义是巨大的。在整个面向对象的语言体系中,一切设计模式都是由&多态&延伸而来,对于接口和委托都是在我们面向对象设计中使用很多的,目的较多的是在使用时扩大参数的约束性。
& & 在方法的返回值类型中,返回的类型应该声明为最强的类型,以免受限于特定的类型。
& &以上是一篇简单介绍方法参数的文章,在文章内容中主要对于介绍可选参数、命名参数等。以上的内容如果有不足的地方还望大家多多包涵,也希望能够指出对应的问题。知识先于模范,后于反思。学习完一点后,需要我们去总结和反思,其中的内涵我们才会有时间和精力,以及由能力去思考。
阅读(...) 评论()天极传媒:天极网全国分站
您现在的位置:
& &&你必须知道的.NET之对接口和抽象类
你必须知道的.NET之对接口和抽象类论坛整理 13:12
  1. 引言  在我之前的一篇post《抽象类和接口的谁是谁非》中,和同事管伟的讨论,得到很多朋友的关注,因为是不成体系的论道,所以给大家了解造成不便,同时关于这个主题的系统性理论,我认为也有必要做以总结,因此才有了本篇的新鲜出炉。同时,我将把上贴中的问题顺便也在此做以交代。  2. 概念引入  什么是接口?  接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口方法不能包含任何实现,CLR允许接口可以包含事件、属性、索引器、静态方法、静态字段、静态构造函数以及常数。但是注意:C#中不能包含任何静态成员。一个类可以实现多个接口,当一个类继承某个接口时,它不仅要实现该接口定义的所有方法,还要实现该接口从接口中继承的所有方法。  定义方法为:  
public interface System.IComparable{ int CompareTo(object o);}public class TestCls: IComparable{ public TestCls() { } private int _ public int Value {  get { return _ }  set { _value = } } public int CompareTo(object o) {  //使用as模式进行转型判断  TestCls aCls = o as TestC  if (aCls != null)  {    //实现抽象方法    return _value.CompareTo(aCls._value);  } }}  什么是抽象类?  抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。抽象类不能实例化,必须通过继承由派生类实现其抽象方法,因此对抽象类不能使用new关键字,也不能被密封。如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象类。另外,实现抽象方法由overriding方法来实现。  定义方法为:  
/// /// 定义抽象类/// abstract public class Animal{ //定义静态字段 static protected int _ //定义属性 public abstract static int Id {     } //定义方法 public abstract void Eat();  //定义索引器 public string this[int i] {     } ///  /// 实现抽象类 ///  public class Dog: Animal {  public static override int Id  {    get {return _}    set {_id =}  }  public override void Eat()  {    Console.Write("Dog Eats.")  } }  3. 相同点和不同点  3.1 相同点  都不能被直接实例化,都可以通过继承实现其抽象方法。  都是面向抽象编程的技术基础,实现了诸多的设计模式。  3.2 不同点  接口支持多继承;抽象类不能实现多继承。  接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。  接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。  接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。  接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。  接口可以作用于值类型和引用类型;抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。  通过相同与不同的比较,我们只能说接口和抽象类,各有所长,但无优略。在实际的编程实践中,我们要视具体情况来酌情量才,但是以下的经验和积累,或许能给大家一些启示,除了我的一些积累之外,很多都来源于经典,我相信经得起考验。所以在规则与场合中,我们学习这些经典,最重要的是学以致用,当然我将以一家之言博大家之笑,看官请继续。  3.3 规则与场合  请记住,面向对象思想的一个最重要的原则就是:面向接口编程。  借助接口和抽象类,23个设计模式中的很多思想被巧妙的实现了,我认为其精髓简单说来就是:面向抽象编程。  抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供功能。  接口着重于CAN-DO关系类型,而抽象类则偏重于IS-式的关系;  接口多定义对象的行为;抽象类多定义对象的属性;  接口定义可以使用public、protected、internal 和private修饰符,但是几乎所有的接口都定义为public,原因就不必多说了。  “接口不变”,是应该考虑的重要因素。所以,在由接口增加扩展时,应该增加新的接口,而不能更改现有接口。  尽量将接口设计成功能单一的功能块,以.NET Framework为例,IDisposable、IDisposable、IComparable、IEquatable、IEnumerable等都只包含一个公共方法。  接口名称前面的大写字母“I”是一个约定,正如字段名以下划线开头一样,请坚持这些原则。  在接口中,所有的方法都默认为public。  如果预计会出现版本问题,可以创建“抽象类”。例如,创建了狗(Dog)、鸡(Chicken)和鸭(Duck),那么应该考虑抽象出动物(Animal)来应对以后可能出现风马牛的事情。而向接口中添加新成员则会强制要求修改所有派生类,并重新编译,所以版本式的问题最好以抽象类来实现。  从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。  对抽象类不能使用new关键字,也不能被密封,原因是抽象类不能被实例化。  在抽象方法声明中不能使用 static 或 virtual 修饰符。  以上的规则,我就厚颜无耻的暂定为T14条吧,写的这么累,就当一时的奖赏吧。大家也可以互通有无,我将及时修订。  4. 经典示例  4.1 绝对经典  .NET Framework是学习的最好资源,有意识的研究FCL是每个.NET程序员的必修课,关于接口和抽象类在FCL中的使用,我有以下的建议:  FCL对集合类使用了基于接口的设计,所以请关注System.Collections中关于接口的设计实现;  FCL对数据流相关类使用了基于抽象类的设计,所以请关注System.IO.Stream类的抽象类设计机制。  4.2 别样小菜  下面的实例,因为是我的理解,因此给经典打上“相对”的记号,至于什么时候晋升为“绝对”,就看我在.NET追求的路上,是否能够一如既往的如此执着,因此我将把相对重构到绝对为止(呵呵)。 本示例没有阐述抽象类和接口在设计模式中的应用,因为那将是另一篇有讨论价值的文本,本文着眼与概念和原则的把握,但是真正的应用来自于具体的需求规范。  设计结构如图所示:    1. 定义抽象类
public abstract class Animal{ protected string _ //声明抽象属性 public abstract string Name {   }//声明抽象方法public abstract void Show();//实现一般方法public void MakeVoice(){ Console.WriteLine("All animals can make voice!");} }  2. 定义接口
public interface IAction{ //定义公共方法标签 void Move();}  3. 实现抽象类和接口  
public class Duck : Animal, IAction{ public Duck(string name) {  _name = }//重载抽象方法 public override void Show() {  Console.WriteLine(_name + " is showing for you."); } //重载抽象属性 public override string Name {  get { return _} }//实现接口方法public void Move(){ Console.WriteLine("Duck also can swim.");}}public class Dog : Animal, IAction{ public Dog(string name) {  _name = } public override void Show() {  Console.WriteLine(_name + " is showing for you."); } public override string Name {  get { return _ } } public void Move() {  Console.WriteLine(_name + " also can run."); }}  4. 客户端实现  
public class TestAnmial{ public static void Main(string [] args) {  Animal duck = new Duck("Duck");  duck.MakeVoice();  duck.Show();  Animal dog = new Dog("Dog");  dog.MakeVoice();  dog.Show();  IAction dogAction = new Dog("A big dog");  dogAction.Move(); }}  5. 他山之石  正所谓真理是大家看出来的,所以将园子里有创新性的观点潜列于此,一是感谢大家的共享,二是完善一家之言的不足,希望能够将领域形成知识,受用于我,受用于众。  dunai认为:抽象类是提取具体类的公因式,而接口是为了将一些不相关的类“杂凑”成一个共同的群体。至于他们在各个语言中的句法,语言细节并不是我关心的重点。  桦山涧的收藏也很不错。  Artech认为:所代码共用和可扩展性考虑,尽量使用Abstract Class。当然接口在其他方面的优势,我认为也不可忽视。  shenfx认为:当在差异较大的对象间寻求功能上的共性时,使用接口;当在共性较多的对象间寻求功能上的差异时,使用抽象基类。  最后,MSDN的建议是:  如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单易行的方法来控制组件版本。通过更新基类,所有继承类都随更改自动更新。另一方面,接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。  如果创建的功能将在大范围的全异对象间使用,则使用接口。抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。  如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。  如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。抽象类允许部分实现类,而接口不包含任何成员的实现。  6. 结论  接口和抽象类,是论坛上、课堂间讨论最多的话题之一,之所以将这个老话题拿出来再议,是因为从我的体会来说,深刻的理解这两个面向对象的基本内容,对于盘活面向对象的抽象化编程思想至关重要。本文基本概况了接口和抽象类的概念、异同和使用规则,从学习的观点来看,我认为这些总结已经足以表达其核心。但是,对于面向对象和软件设计的深入理解,还是建立在不断实践的基础上,Scott说自己每天坚持一个小时用来写Demo,那么我们是不是更应该勤于呢。对于接口和抽象类,请多用而知其然,多想而知其奥吧。  查阅关于的全部文档
(作者:Anytao责任编辑:方舟)
天极新媒体&最酷科技资讯扫码赢大奖
* 网友发言均非本站立场,本站不在评论栏推荐任何网店、经销商,谨防上当受骗!}

我要回帖

更多关于 硬盘录像机的net接口 的文章

更多推荐

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

点击添加站长微信