接口定义好了,也实现了接口,我何时来使用这个接口呢?为什么要使用它呢?是不是这样的,我可以通过定义的一个接口,通过接口直接访问实现接口的类呢?还是要直接访问这个类(不通过接口)?哪种方法好呢?
请各位详细讲解,分不够再加就是!谢谢!

解决方案 »

  1.   

    如果能通过接口直接访问实现了接口的类,请举个列子。还有,如果能直接通过接口访问,那么这样和直接new类的对象哪种方式好点?谢谢!
      

  2.   

    这是书截下来的~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      让我们看一个更具体的例子:素数测试。表2所示的代码声明了一个接口(C#中的一个概念),它只有一个方法:IsPrime。 表2 interface Strategy 

    bool IsPrime(int n); 
    }   接口就象一个合约,它是所有派生类必须遵从的规范。更为特别的是,它定义方法的签名但并不实现它们,实现接口的具体类必须提供这些方法的实现。在这一点上,C#明显优于C++,因为C++缺乏对接口在语言上的原生的支持。C++程序员一般是通过定义只包含纯虚成员函数的的抽象类来创建接口。在C#中,所有接口成员都是public的,所有实现接口的类都必须实现接口中所有方法。  现在假定我们有三个不同的素数测试算法,每一种都有自己的性能和精度指标。其中之一属于计算密集型,对因数进行彻底测试,另外一种算法速度较快但对大数的测试结果未必准确。我的应用就是要询问用户期望何种执行性能,然后根据其选择调用相应的算法。我把算法封装到实现Strategy接口的若干个类中。参见表3示例代码。 表3 class Fermat : Strategy 

    public bool IsPrime(int n) 

    bool result = false; 
    //使用Fermat法测试n是否为素数,果真,则更新result的值 
    Console.WriteLine("Using Fermat's test"); 
    return result; 


    用设计模式固化你的C#程序(2)Design Patterns: Solidify Your C# Application Architecture with Design Patterns中文版(上篇) 作者:Samir Bajaj 
    译者:荣耀 
      采用这种方式实现所有三个算法后,我就能够采用一种和任何特定算法实现细节毫无耦合的方式来设计客户程序。客户持有一个接口引用,并且不必知道该接口具体实现的任何细节。参见表4代码。 表4 class Primality 

    private Strategy strategy; 
    public Primality(Strategy s) 

    strategy = s; 

    public bool Test(int n) 

    return strategy.IsPrime(n); 

    }   最后,我创建了一个Primality类的实例,根据用户输入,以相应算法对其进行初始化。Primality类的Test方法调用相应的算法对象(实现Strategy接口的对象)的IsPrime方法。 
    用这种方式构造算法族有很多优点,但最大的优点还是客户程序同特定算法实现细节毫无耦合关系。这提高了扩展性—可以开发别的算法并将其无缝插入,只要它们遵从基本接口规范。这样就可以动态变换算法。而且,strategy模式还避免了因为使用条件语句而使客户程序代码变得混乱的可能性。【译注:你理解这句话的含义吗J】 【译注:以下是strategy模式完整示例 C#示例: 
    using System; 
    interface Strategy 

    bool IsPrime(int n); 

    class Miller : Strategy 

    public bool IsPrime(int n) 

    bool result = false; 
    //使用Miller法测试n是否为素数,果真,则更新result值 
    Console.WriteLine("Using Miller's algorithm"); 
    return result; 


    class Fermat : Strategy 

    public bool IsPrime(int n) 

    bool result = false; 
    //使用Fermat法测试n是否为素数,果真,则更新result值 
    Console.WriteLine("Using Fermat's algorithm"); 
    return result; 


    class Mersenne : Strategy 

    public bool IsPrime(int n) 

    bool result = false; 
    //使用Mersenne法测试n是否为素数,果真,则更新result值 
    Console.WriteLine("Using Mersenne's algorithm"); 
    return result; 


    class Primality 

    private Strategy strategy; public Primality(Strategy s) 

    strategy = s; 

    public bool Test(int n) 

    return strategy.IsPrime(n); 


    class Application 

    public static void Main() 

    Console.Write("Number to be tested: "); 
    string input = Console.ReadLine(); 
    int n = Int32.Parse(input); 
    Console.Write("Desired algorithm performance: lo, medium, hi? "); 
    input = Console.ReadLine(); 
    char ch = char.Parse(input); 
    Primality prime = null; 
    switch (ch) 

    case 'l': 
    case 'L': 
    prime = new Primality(new Miller()); 
    break; 
    case 'm': 
    case 'M': 
    prime = new Primality(new Fermat()); 
    break; 
    case 'h': 
    case 'H': 
    prime = new Primality(new Mersenne()); 
    break; 

    if (prime != null) 

    bool result = prime.Test(n); 

    else 
    Console.WriteLine("Bad Choice!"); 


    /*以下是某次测试输出结果: 
    Number to be tested:1 
    Desired algorithm performance: lo, medium, hi? M 
    Using Fermat's algorithm 
    */ 
      

  3.   

    首先,使用接口可以实现多继承。因为CLR仅支持从一个类继承下来,但是可以继承多个接口,所以你想实现一个多继承的类就要用到接口。比如 class myclass : baseclass, Iinterface。
    其次,接口继承意味着这个类型会实现接口所规定的方法签名。
    你可以把这个类显式转化为接口的类型,但是并不会为这个类分配新的空间,它仍然是在原来的内存区域上。可以把它想象成只是给了它一个外号。所以说用哪种方式调用时没有区别的。
      

  4.   

    楼主的说的是web server服务吧?
    呵呵,去 web server板块看就知道了很简单的,发布~引用~
      

  5.   

    接口在类里实现。
    楼主可以参考《COM本质论》这本书。里面有讲接口,虽然不是完全相同。
      

  6.   

    还有,谁能告诉我别人如何通过我的接口访问和调用我的程序么?你对接口的理解有点误解了,接口并不是指提供给外部访问内部的通道,就像coley(唉~眼镜又厚了~)所说,你大概指的是web service。事实上接口是一个合约,规定这个类将会实现什么功能。
      

  7.   

    题目:1. 设计如下接口和类
    ■接口Istudent,具有方法: bool credits ( );
    ■接口I faculty,具有方法: decimal bonus( );
    ■类Undgradu实现接口Istudent,
     类中定义若干域和方法:
     构造方法:参数为studentID和name
     credits(int):如果学生完成的学分大于380分,则返回true,否则返回false。
    ■类Gradu实现接口Istudent
     类中定义若干域
     构造方法:参数为GraduatStudentID, Name,Age
     方法credits(int):如果学生完成的学分大于150分,则返回true,否则返回false
    ■类teacher实现接口Ifaculty,
     类中定义若干域
     构造方法:参数为facultyID和name
     方法bonus(int):根据完成的课时数,计算应该发放的奖金
    ■类GraduTeacher继承类Gradu,并且实现接口Ifaculty
     类中定义若干域
     构造方法:参数为facultyID、GraduatStudentID,Name、Age
     方法bonus(int,int):根据完成的课时数、学分数,计算应该发放的奖金。
    ■设计一个测试方案:
     方法test():调用方法credits(),如果返回值是true,打印“恭喜,您可以毕业了”,否则打印出:“加油,继续努力”
     为每个类生成至少一个对象,输入适当的数据,测试各个方法。
    Interface Istudent
    {
        bool credites(int){};
    }Interface Ifaculty
    {
        decimal bonus(int,int){};
    }
    public class Undgradu: Istudent
    {
        public Undgradu(string studentID, string name)
        {
        }
        
        public bool credites(int score)
        {
            if(score > 380)
                return true;
            else
                return false;
        }
    }依次类推各类测试方案:
    public static void main(){
        Istudent [] s = new Istudent[2];
        s[0]          = new Undgradu(xxx,yyy);
        s[1]          = new Gradu(xxx,yyy);    for( int i = 0 ; i < s.Length ; i ++ ){
            if( s[i].credits( score ) )
                Control.WriteLine("恭喜,您可以毕业");
            else 
               Control.WriteLine("加油,继续努力");
        }
    }