zoukankan      html  css  js  c++  java
  • Csharp中的关键字示例及代码演示之接口

    接口(Interface):

      在以往我们对接口(Interface)的理解中,可以说接口就是一种契约,定义了遵守该契约的签名。

      当然,接口和前面所说的抽象类很相似,不能被实例化,被继承时派生类必须实现接口中的签名。但是抽象类是特殊的类,只能是单继承,而接口可以多继承,接口可以包含属性,事件,索引器和方法(此方法不能包含实现的code)。实例1:

      

      1 /*
    2 * ${res:XML.StandardHeader.CreatedByYangbo}
    3 * 用户: ${YangBo}
    4 * 日期: 10/14/2011
    5 * 时间: 13:50
    6 *
    7 */
    8 using System;
    9 using InterFaceTestDemo;
    10
    11 namespace InterFaceTestDemo
    12 {
    13 //接口可以多继承
    14 public class Animal:IAnimal,IEat
    15 {
    16 private string name;
    17 private Int32 age;
    18 public Animal(string name,Int32 age)
    19 {
    20 this.age=age;
    21 this.name=name;
    22 }
    23
    24 public String Name
    25 {
    26 get
    27 {
    28 return name;
    29 }
    30 set
    31 {
    32 name=value;
    33 }
    34 }
    35
    36 public Int32 Age
    37 {
    38 get
    39 {
    40 return age;
    41 }
    42 set
    43 {
    44 age=value;
    45 }
    46 }
    47
    48
    49
    50 //接口可以包含方法
    51 public interface IEat
    52 {
    53 void Eat();
    54 }
    55 //可以包含索引器
    56 public interface INum
    57 {
    58 Int32 this[Int32 index]
    59 {get;set;}
    60 }
    61
    62 //接口可以包含属性
    63 public interface IAnimal
    64 {
    65 String Name
    66 {get;set;}
    67 Int32 Age
    68 {get;set;}
    69
    70 }
    71 //包含事件
    72 public interface IEvent
    73 {
    74 event EventHandler IsDog;
    75 }
    76 public class Dog:INum,IEvent
    77 {
    78 event EventHandler IsDog;
    79 private void IsDog()
    80 {
    81 //ToDO: Something for this Function
    82 }
    83
    84 private Int32[] arr=new Int32[100];
    85 public Int32 this[Int32 index]
    86 {
    87 get
    88 {
    89 return arr[index];
    90 }
    91 set
    92 {
    93 arr[index]=value;
    94 }
    95 }
    96 }
    97
    98
    99 public static void Main()
    100 {
    101 Animal an=new Animal("Duck",2);
    102 Console.WriteLine("name is {0},age is {1}",an.Name,an.Age);
    103
    104 Dog dog=new Animal.Dog;
    105 Random ad=new Random(100);
    106 for (int i = 0; i < 10; i++) {
    107 dog[i]=ad.Next();
    108 Console.WriteLine("The Elements #{0}={1}",i,dog[i]);
    109 }
    110 }
    111
    112 }
    113 }

      Interface and Virtual Class

      很多时候,关于接口和抽象类的区别的文章不胜枚举,但是仍有很多疑惑,什么时候该用接口,什么时候该用抽象类呢?我们说接口是一个契约,是一组规则,继承接口的派生类或接口要遵守该接口的约束。比如上面实现的Animal类和IAnimal接口。也就是说,Animal类继承了IEat接口,那就必须要实现该接口所包含的Eat()方法。关于抽象类,强调更多的是共性,如所有实现了Animal类的动物都要吃,所以可以写一个抽象类的抽象方法,然后继承该类的Animal就都可以去KFC了,哈哈。另外,接口是不同类对象之前的行为抽象。抽象类是同类对象之间存在的抽象。

      判断应用Interface or Virtual Class的原则

        Is-A 与 CAN-DO关系,一个类型仅可以继承一个实现,如果基类和派生类有一个Is-A关系,就可以考虑用抽象类,也就像我们的Dog类和Animal类一样,我们可以说狗是动物,但不能说动物是狗,千万别!!这个就是Is-A的关系. 接口隐含一个CAN-DO关系,如果认为CAN-DO功能属于多个类型,就使用接口。

        易用性。我们使用计算机的目的就是为了简单,方便(我这么想的,就目前计算机的作用不仅仅是这样的”简单“了)如果你的程序让测试的同事都无法忍受,那你还期望客户给你Silme么?当然在不影响性能与功能的前提下,代码越简单越好。有些地方感觉用抽象类或是接口都可以,那么为何不使用抽象类?!你要清楚,要重新创建接口,并且还要实现接口中的所有方法,还不能共享大量的代码,谁让你继承了呢?!

      应用场景的不同才是抽象类和接口的区别的根本。项目是应需求而生的,有什么样的需求,然后再这样的场景下利用最合适的技术才是王道。

    以上属个人观点,如有疑问可参与讨论。

  • 相关阅读:
    IfcFeatureElementAddition
    IfcOpeningElement
    IfcRelNests
    IfcElementAssemblyType
    IfcProjectionElement
    IfcFeatureElement
    IfcRelDefines
    Win10 Anaconda配置tensorflow
    Anaconda升级
    Anaconda 台式机环境
  • 原文地址:https://www.cnblogs.com/tymonyang/p/CsharpInterface.html
Copyright © 2011-2022 走看看