接口是从原来COM中引入的概念,这样会是为了进行安全的使用。

解决方案 »

  1.   

    不知你说的是否是Interface,如果是那么哪个“有人”说的不错,未来的编程多都是基于接口的编程了。hqywork的观点是没有根据的,这样的假设并不是事实.
      

  2.   

    阐述我个人的观点,大家看看对不对,如果错了,不负责,
    接口的提供是为了更好的实现类的安全和扩展,
    通过让类来实现接口,可以将类内的方法私有化而又使外界可以访问,
    这是从安全的角度来考虑的,例如:
    msdn的例子接口可以使用多重继承。在下面的示例中interface IControl
    {
       void Paint();
    }
    interface ITextBox: IControl
    {
       void SetText(string text);
    }
    interface IListBox: IControl
    {
       void SetItems(string[] items);
    }
    interface IComboBox: ITextBox, IListBox {}
    接口 IComboBox 同时从 ITextBox 和 IListBox 继承。类和结构可以实现多个接口。在下面的示例中interface IDataBound
    {
       void Bind(Binder b);
    }
    public class EditBox: Control, IControl, IDataBound
    {
       public void Paint() {...}
       public void Bind(Binder b) {...}

    类 EditBox 从类 Control 派生,并且同时实现 IControl 和 IDataBound。在前面的示例中,IControl 接口中的 Paint 方法和 IDataBound 接口中的 Bind 方法是使用 EditBox 类的公共成员实现的。***注意***C# 提供了实现这些方法的另一种方式,允许实现类避免使这些成员成为公共的。接口成员可以用限定名来实现。例如,可以改为通过提供 IControl.Paint 和 IDataBound.Bind 方法来实现 EditBox 类。 public class EditBox: IControl, IDataBound
    {
       void IControl.Paint() {...}
       void IDataBound.Bind(Binder b) {...}
    }
    用这种方式实现的接口成员称为显式接口成员,这是因为每个成员都显式指定实现的接口成员。*****只能通过接口调用显式接口成员*****。例如,只能通过强制转换为 IControl 接口的方式调用 EditBox 的 Paint 方法实现。看到了吧,方法被定义为私有的,外界不可以直接访问方法,只能通过借口类型去访问,如果没有接口,私有方法怎么被外界访问呢???
    扩展方面:只要接口不变,接口的实现发生变化,调用类的客户程序照样可以运行,
    因为接口使得具体的实现变的透明。你可能会问,如果用来提供重载方法和虚方法(重写)来实现不也行吗,
    我觉得这还是不太一样,重载只是提供了方法自身的扩展,并且这种扩展
    是极其狭窄的;而重写则仅能通过继承,在派生类中实现,接口则不同了,
    它使得类的方法的拓展在类自身可以自由实现以上是我的体验,不知道说得对不对,非常希望听听别人的看法。
    请指教。
      

  3.   

    另外,下大家介绍一个个人的c#论坛:
    我看过纪俊的********** www.vbuser.net/csource ******************
    很是不错,比那些公司站点做的还要好, 
    我结识了这个年轻的小伙子,如果你看了他的站点,请不要挑剔
    因为这是出自一个大一的学生的手。    我前一段时间经常看到vb版出现这样的贴子,叹息vb程序员的末路,
    而纪俊从qb起家,写得最多的是asp,面对.net的冲击,最受影响的应该是
    asp,因为asp.net给web页面开发者带来了质变的飞跃,不论从开发还是调试
    不论是vb.net还是C#,作为 asp.net开发的语言载体,对原来的asp开发人员来
    说都是挑战。
        现在,我们这群vb版的程序员应该无话可说,因为,去看看我们这位年轻
    朋友做的----------------------www.vbuser.net/csource,我与这位兄弟
    交流之后,深深的感到了他的可爱,他的谦虚,他的热情,
    水平很高,但是丝毫不狂妄,热爱自己所做的一切并且为之不求回报,
    我们vb版的许多老大们,放下你们的狂妄,去看看我们的小兄弟自己在做的事情,
       去体验一下与csdn截然不同的朴实,原始,去那里探寻vb程序员的未来
    生存之路。    我们其实应该清楚,每隔一段时间,当新技术出现的时候,应该把自己放在和晚辈相同的起点上,这样我们大家才会共同进步。  风格与csdn相似,也是积分制,现在去的话还可以混老大,就像我;
    不过我水平有限,另外由于时间的原因,只是代理斑竹,现诚征斑竹,
    请快快去*********** www.vbuser.net/csource ***************注册
       
      希望大家在一起,能够互相促进,新老朋友共同进步!!!
       
    (在此向纪俊兄弟表示全力支持,并尽可能提供我所有的一切技术资料,
    小站正在建设中,让我们和vs.net走在一起)
    请快快去*********** www.vbuser.net/csource ***************注册
      

  4.   

    呵呵,上面这个帖子是在vb版发的,所以,搬到这里来,好像
    有点驴唇不对马嘴,因为,我也是从vb搬过来的
      

  5.   

    个人体会:
    Interface的一个用处是实现多态:
    OO的三个核心是encapsulation, inheritance and polymorphism.
    它们之间有一定的先后关系, 当我们在用C++时, 它支持多根继承, 所以
    // VCDemo001.cpp : Defines the entry point for the console application.
    //#include "stdafx.h"class A
    {
    public :
    virtual void function1(){};
    };class B
    {
    public:
    virtual void function2(){};
    };class C: public A, B
    {
    public:
    void function1()
    {
    printf("Function1\n");
    };
    void function2()
    {
    printf("Function2\n");
    };
    };int _tmain(int argc, _TCHAR* argv[])
    {
        C* c;
    c = new C();
    A* a;
    a = (A*)c;
    c ->function1();
    a ->function1();  B* b;
    b = (B*)c;
    c ->function2();
    b ->function2(); 
    getchar();
    return 0;
    }在c#中采用了与Java一样的方案, 只许单根继承, 因为多根继承会有一些缺点, 如名字冲突.
    所以, 采用Interface来使用多态的好处. 既设计者只须定义好接口, 只要class是inheritance从这个Interface, 就可将它upcast到Interface, 然后使用Interface中定义的method.using System;namespace ConsoleApplication1
    {
    interface IA
    {
    void function1();
    } interface IB
    {
    void function2();
    } class C: IA, IB
    {
    public void function1()
    {
    Console.WriteLine("Function1"); 
    } public void function2()
    {
    Console.WriteLine("Function2"); 
    }
    } /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
    C c;
    c = new C(); IA a;
    a = (IA)c;
    c.function1(); 
    a.function1();
     
    IB b;
    b = (IB)c;
    c.function2();
    b.function2();
     
    Console.ReadLine();  }
    }
    }
      

  6.   

    很多时候在考虑设计而不是考虑编码的时候,接口才真正清晰,明朗的把它的原理展现给你。如果你看过设计模式这本书,你一定会对软件有一个重新的认识。四人组道出了一个面向对象界的真理:面向接口设计和编程。举个简单的例子,计算机的主板和显卡,他们之间有统一的约定,只要符合PCI扩展的标准,那么你的显卡肯定能插上主板,并能访问主板来的信息。这个约定就是接口。很多时候,在软件开发领域,接口设计应该是系统分析者的事情,也就是Team Leader的是事情了。Team Leader根据需求设计出Schelable的接口和Architecture,程序员根据他的Architecture去编码,最后开发,测试等等。其实,很多时候,你不用接口也能实现相同甚至更完备的功能。但是,有了接口,会使整个设计变得清晰,明朗。如果从软件的扩展性和重用性上看,接口的设计更显的举足轻重。所以说,理解和认识接口应该从设计的角度看,而不是编码的角度。
    附:A Sample需求:在一个表格(已有的Table类)里面我要显示这样一些数据:1 文本信息: 显示文本2 图片信息:显示图片3 视频信息:播放视频设计如下:
    interface IDisplayable
    {
       void Display(Table table);
    }public class Text:IDisplayable
    {
      ....
     .....
      public void Display(Table table)
      {
        //implements the text display method
      }
    }public class Picture:IDisplayable
    {
      ......
      public void Disply(Table table)
      {
        //implements picture display here
       }
    }public class Vedio:IDisplayable
    {
      ......
      public void Disply(Table table)
      {
        //implements vedio play   
      }
    }public class Test
    {
       Text   t  = new Text("Hello");
       Picture p = new Picture("1.jpg");
       Vedio   v = new Vedio("sample.avi");
       
       Table table = new Table();
       Table.Add(t);
       Table.Add(p);
       Table.Add(v);
       Table.Show();   foreach(IDisplayable disp in Table.Items)
       {
           disp.Display(this.table);
        }
       
    }
      

  7.   

    Class 只能单继承 ,Interface可以实现多继承 Interface中只能定义属性和方法,但不其实实现要在继承自她的Class实现不能 创建 Interface实例进行直接调用
     
    ……
      

  8.   

    可以参考thinking in java中讲的接口
    我看c#和java一样
      

  9.   

    有现成的例子可以参考阿,Java的jdbc driver和servlet引擎都是利用interface的来协调各个厂商的产品的,针对功能设计的interfce组可以成为要某种功能的使用方法协议,而各个厂商可以推出各自实现这些接口的产品。
      

  10.   

    To Henry: 在c#中采用了与Java一样的方案, 只许单根继承, 因为多根继承会有一些缺点, 如名字冲突.如果在2个interface中函数名称冲突了,class中如何定义该函数?
    另外
    class C:IA, IB
    {...}
    不算是多继承吗?
      

  11.   

    几点补充:虽然接口可以用来模拟多重继承,但从绝对意义上,那不是真正的多重继承。多重继承带来的好处与它带来的隐患和麻烦一样多。一个成功的软件根本在于扩展性,重用性,和易于维护,(在过去,一个系统的开发费用远比维护升级费用低,可以想象)。而不在于你用什么语言,和什么样的编码技巧。记住,编程语言只是表达和描述思想的一种方式,关键在于设计人的思想。正如外语学院毕业的学生大都很难翻译出成功的外国文学作品,不在于其语言不够纯熟,而是其文学功底不够,也就是思想性的东西不够。所以说,软件界,只有真正的软件设计师,没有真正的编程语言师。一个优雅的设计,能做到把任务描述的清晰,明朗,做到适应尽可能多的异质环境和异常情况,以不重写或少写代码为目标,而且要绝对能并行开发而且各部分互不受影响,也就是要松散耦合。比如,一个简单的BBS,我想各位谁都可以在一个小时内编写妥当,但是重用性
    和扩展性如何呢?我不说,想必大家都明白。
    本人最近闲来无事,设计了一个BBS,感觉.net平台给设计者带来更多的便利和底气。BBS的系统架构大致如下:User Interface<-->BBS WebServices<--->Business Logic<--->Data Access<----->DB Server这大三层小五层结构,相对来说,扩展性和重用性还是可以的。UI层和逻辑层用XML进行数据交互,然后对XML,根据不同的系统去分析。整体架构上套用了Facade Patterns(外观模式---结构型)和Iterate模式。
      

  12.   

    楼上的说的非常好,OOP的重点之一就是代码重用性
    这样完全可以编写一个论坛引擎出来,可惜现在我还是初学,还有很多都不太了解。
      

  13.   

    非常佩服dcren(稻草人)对OOP的认识!