C# 接口的作用

时间:2022-03-07 21:22:06
代码示例:

//公共接口: "动物" 
public interface IAnimal
 {
        void Behavior(); //行为方法,描述各种动物的特性 
}
 
//类: 狗 
public class Dog : IAnimal
{
        public void Behavior()
        {
               //Console.Write("我晚上睡觉,白天活动");
                MessageBox.Show("我晚上睡觉,白天活动");
         }
 }
 
//类: 猫 
public class Cat : IAnimal
{
      public void Behavior()
      {
                //Console.Write("我白天睡觉,晚上活动");
                MessageBox.Show("我白天睡觉,晚上活动");
       }
 }
//简单的应用: 
public static Main() 

       Dog myDog = new Dog(); 
       myDog.Behavior(); //输出: "我晚上睡觉,白天活动" 
       Cat myCat = new Cat(); 
       myCat.Behavior(); //输出: "我白天睡觉,晚上活动" 
}


该实例使用了Animal这个接口,但是我不使用接口也同样可以达到目的:只需要在类中定义该方法,在主函数中实例化一个对象,然后调用它结果也是一样,这样一来接口不是多此一举,完全体现不到接口的作用吗?还请各位帮忙解答小弟的疑问,不甚感激。

26 个解决方案

#1


        //公共接口: "动物" 
        public interface IAnimal
        {
            void Behavior(); //行为方法,描述各种动物的特性 
        }
 
        //类: 狗 
        public class Dog : IAnimal
        {
            public void Behavior()
            {
                Console.WriteLine(name() + "我晚上睡觉,白天活动");
            }
            string name()
            {
                return "狗";
            }
        }
 
        //类: 猫 
        public class Cat : IAnimal
        {
            string info = "猫";
            public void Behavior()
            {
                Console.WriteLine(info + "我白天睡觉,晚上活动");
            }
        }
        //简单的应用: 
        static void Main(string[] args)
        {
            IAnimal myDog = new Dog();
            myDog.Behavior(); //输出: "狗我晚上睡觉,白天活动" 
            IAnimal myCat = new Cat();
            myCat.Behavior(); //输出: "猫我白天睡觉,晚上活动" 

        }
这才是接口的作用
无论 Dog 和 Cat 是如何的不同,只要他实现了 IAnimal 接口
我们就可以通过 Behavior 方法进行相关操作,并不需要去管他们内部是如何做的

#3


引用 1 楼 xuzuning 的回复:
        //公共接口: "动物" 
        public interface IAnimal
        {
            void Behavior(); //行为方法,描述各种动物的特性 
        }
 
        //类: 狗 
        public class Dog : IAnimal
        {
            public void Behavior()
            {
                Console.WriteLine(name() + "我晚上睡觉,白天活动");
            }
            string name()
            {
                return "狗";
            }
        }
 
        //类: 猫 
        public class Cat : IAnimal
        {
            string info = "猫";
            public void Behavior()
            {
                Console.WriteLine(info + "我白天睡觉,晚上活动");
            }
        }
        //简单的应用: 
        static void Main(string[] args)
        {
            IAnimal myDog = new Dog();
            myDog.Behavior(); //输出: "狗我晚上睡觉,白天活动" 
            IAnimal myCat = new Cat();
            myCat.Behavior(); //输出: "猫我白天睡觉,晚上活动" 

        }
这才是接口的作用
无论 Dog 和 Cat 是如何的不同,只要他实现了 IAnimal 接口
我们就可以通过 Behavior 方法进行相关操作,并不需要去管他们内部是如何做的

如果这样写的话估计楼主更加困惑了 为啥不直接Cat cat=new Cat(); 非要IAnimal cat=new Cat();
接口的作用就是 功能模块对接 人家名字都叫“接口”了吗。那么如何对接呢?
要有一个标准,大家都去遵循这个标准就ok了是吗。
那么问题来了 啥时候要用这个接口呢??
当你写业务需要有个动物的行为的方法,这个方法肯定是要的,但是目前没有想好如何写,并且不同的动物有各自的行为。那么这个时候动物各自的行为让每个动物类自己去实现,你只要把这个行为的接口预留出来,到时候和那个动物类对接就自动去这个动物类的行为方法不是很完美吗!!
就好比你电脑主板上有个显卡插槽就是 接口 先预留着 你买那个显卡是你自己的事情,到时候显卡一插 就等于对接了 。这下明白了吧!!!

#4


接口的实际运用应该以参数传递更加好理解 

public interface IAnimal
        {
            void Behavior(); 
        }
  
       
        public class Dog : IAnimal
        {
            public void Behavior()
            {
                Console.WriteLine(name() + "我晚上睡觉,白天活动");
            }
            string name()
            {
                return "狗";
            }
        }
  

        public class Cat : IAnimal
        {
            string info = "猫";
            public void Behavior()
            {
                Console.WriteLine(info + "我白天睡觉,晚上活动");
            }
        }
       
       public class AnimalBehavior
      {
             void StartBehavior(IAnimal animal)
             {
                      animal.Behavior();// 这里你别管是猫还是狗 就是要先定好这个方法
             }

              void RefBeh()
             {
                      AnimalBehavior ab=new ......

                      ab.StartBehavior(new Car());// 让猫叫 把猫对接上
                      ab.StarBehavior(new Dog());//同样 要让狗叫 把狗对接上
             }
      }
[/code]

这才是接口 真正的用处
类似于委托,只不过 接口是把多个函数 作为一个对象来传递而已。

#5


3L最后拿电脑显卡插口举例相当形象。顶一个。

#6


不使用接口,作者大概也会使用一个 abstract class 或者普通的可继承的 class 来定义 Animal。

所以这里的关键不是“接口”这个术语,而是“继承”这个目的。

代码中使用 Behavior 这个空洞的词儿,容易让人产生一种不信任感、反感,如果换成一个对设计有具体意义的词儿(例如“Eat”,或者根据它的领域设计需求而增加“骨骼数量”的特性)那么就比较容易明白其“自然的”对应概念。

在设计中我们把所有需要具体类型中抽象出来的东西都叫做接口,于是具体类型的父类的特性就是接口特性。子类对象从父类对象中继承了一些功能设计(从而不需要为子类对象单独设计这方面的操作细节)。例如一旦我们说“张柏芝是个母亲”,我们就知道“母亲”可以做什么事、享受什么待遇。继承与多态是一个问题的两面,我们使用继承的目的,也就是为了使用多态;反之亦然。

在 .net 中(在java中也是如此)是不支持class 的多重继承的。如果支持多重继承,那么根本不需要 interface 这种东西。可惜不支持多重继承,于是就只好用 interface 来模拟多重继承。因此假设一个 Cat 它既是 Animal 同时又是 Spirit,甚至同时又是“顾客”(例如用在宠物店软件系统中),那么Cat 的两个设计上的父类,最多只有一个可以在 c# 实现为 class,其它的都必须实现为 interface。但是本质上,在设计中不应该过分强调 interface 与 abstract class 的区别,所有的 interface 都可以看你做class、所有的class都可以看做一种 interface。

说 Cat 类型继承了 Animal 类型的特征,千万不要用很俗的“一个 Cat 内部有一个 Animal” 这种话。继承是指概念上的继承,一个 Cat 本身“就是”一个 Animal,而不是很俗地去理解接口概念。这里的重点是“is_a”而不是“has_a”关系,有的人把接口解释为“has_a”就会在随后的设计和实现中落入错误的泥潭,因为他可能设计程序时走了很久、一直在黑暗中,从一开始就没有明白区分这一点。

#7


那么Cat 的两个设计上的父类   -->   那么Cat 的所有设计上的父类

接口的作用,应该从“图上”去理解,一般人应该先学会画图,然后才动手写代码。如果你什么都是使用代码来理解,代码是最低级的东西,那你就容易认为“完全体现不到作用”。

在设计上,它会分为两个层次。一个层次是仅仅涉及到 Animal 世界的蓝图。然后另外一个层次的设计图才会分别涉及到各个子类的细节。这里是分层隔离的,用不同层次的蓝图,就简化了系统设计,因为所有低层次的类型都可以通过高层次的父类的设计图来与相关外界对象通讯,而不需要在低层次的图纸中再次画一遍这些接口需求。

#8


接口的作用是规范。
继承该接口,就必须实现其中的方法。
作用就是让有相同行为的同一类事物,都去实现他们的类似行为。
说白了,就是 狗和猫,都需要吃东西,那么他们继承动物接口,动物接口定义吃的方法。狗和猫分别实现狗吃狗粮,猫吃猫粮。但是他们实现的内容是不同的。可是他们必须实现动物中这个吃东西的方法。这就是规范。
比如电脑就不用继承这个动物的接口。因为电脑不需要吃东西。但是电脑可能会继承  机械 这个接口。
接口,就是定义一类事物的相同行为。这就是规范 C# 接口的作用

#9


引用 5 楼 ajh99990 的回复:
3L最后拿电脑显卡插口举例相当形象。顶一个。

+1

#10


引用 8 楼 hanjun0612 的回复:
接口的作用是规范。
继承该接口,就必须实现其中的方法。
作用就是让有相同行为的同一类事物,都去实现他们的类似行为。
说白了,就是 狗和猫,都需要吃东西,那么他们继承动物接口,动物接口定义吃的方法。狗和猫分别实现狗吃狗粮,猫吃猫粮。但是他们实现的内容是不同的。可是他们必须实现动物中这个吃东西的方法。这就是规范。
比如电脑就不用继承这个动物的接口。因为电脑不需要吃东西。但是电脑可能会继承  机械 这个接口。
接口,就是定义一类事物的相同行为。这就是规范 C# 接口的作用

接口的目的是  对接 对接 对接 不是标准 
现在很多人都说接口是标准那是错误的
应为要对接 你必须制定一样的标准才能对接上  所以才要有标准
  
比如 5mm的管子 和 10mm的管子对接 如果用8mm的接口   你的5mm管子口扩大到8mm  10mm的管子缩小到8mm  这样就能对接上了
所以记住接口是为了对接的口子,就是这么简单的道理。

#11


收回楼上的话,我说错了。

#12


不怎么使用接口

倒是通用业务模块的时候,在给二次开发留下余地的时候会用到

#13



引用 楼主 zdhlwt2008 的回复:
代码示例:

//公共接口: "动物" 
public interface IAnimal
 {
        void Behavior(); //行为方法,描述各种动物的特性 
}
 
//类: 狗 
public class Dog : IAnimal
{
        public void Behavior()
        {
               //Console.Write("我晚上睡觉,白天活动");
                MessageBox.Show("我晚上睡觉,白天活动");
         }
 }
 
//类: 猫 
public class Cat : IAnimal
{
      public void Behavior()
      {
                //Console.Write("我白天睡觉,晚上活动");
                MessageBox.Show("我白天睡觉,晚上活动");
       }
 }
//简单的应用: 
public static Main() 

       Dog myDog = new Dog(); 
       myDog.Behavior(); //输出: "我晚上睡觉,白天活动" 
       Cat myCat = new Cat(); 
       myCat.Behavior(); //输出: "我白天睡觉,晚上活动" 
}


该实例使用了Animal这个接口,但是我不使用接口也同样可以达到目的:只需要在类中定义该方法,在主函数中实例化一个对象,然后调用它结果也是一样,这样一来接口不是多此一举,完全体现不到接口的作用吗?还请各位帮忙解答小弟的疑问,不甚感激。


你这个和我写的那个感觉没有多大区别呢。请指教。

#14


引用 13 楼 zdhlwt2008 的回复:
...
你这个和我写的那个感觉没有多大区别呢。请指教。


public static void Main()
{
    IAnimal[] 宠物们 = { new Dog(), new Cat() };  // 这里宠物们就是泛指,不能用Dog[],也不能用Cat[]
    foreach(var 宠物 in 宠物们)
    {
        宠物.Behavior();
    }
}

#15


引用 2 楼 xunzaosiyecao 的回复:
C# 接口作用的深入理解


       
      static void Main(string[] args)
        {
            IAnimal myDog = new Dog();
            myDog.Behavior(); //输出: "狗我晚上睡觉,白天活动" 
            IAnimal myCat = new Cat();
            myCat.Behavior(); //输出: "猫我白天睡觉,晚上活动" 
 
        }


//简单的应用: 
public static Main() 

       Dog myDog = new Dog(); 
       myDog.Behavior(); //输出: "我晚上睡觉,白天活动" 
       Cat myCat = new Cat(); 
       myCat.Behavior(); //输出: "我白天睡觉,晚上活动" 
}


这两段代码有和区别,实现的效果一样啊,有和区别,请指教,万分感谢!

#16


       Dog myDog = new Dog(); 
       myDog.Behavior(); //输出: "我晚上睡觉,白天活动" 
就和你自己说的一样:不使用接口也同样可以达到目的:只需要在类中定义该方法
那么 public class Dog : IAnimal 中
IAnimal 在这里的作用仅仅是限定你必须书写一个 Dog.Behavior 方法,仅此而已

            IAnimal myDog = new Dog();
            myDog.Behavior(); //输出: "狗我晚上睡觉,白天活动" 
就把具体的狗,抽象成了动物
操作是对动物进行的,并不去管 myDog 是
IAnimal myDog = new Dog();
还是
IAnimal myDog = new Cat();
得来的

#17


引用 16 楼 xuzuning 的回复:
C# 接口作用的深入理解



引用 16 楼 xuzuning 的回复:
       Dog myDog = new Dog(); 
       myDog.Behavior(); //输出: "我晚上睡觉,白天活动" 
就和你自己说的一样:不使用接口也同样可以达到目的:只需要在类中定义该方法
那么 public class Dog : IAnimal 中
IAnimal 在这里的作用仅仅是限定你必须书写一个 Dog.Behavior 方法,仅此而已

            IAnimal myDog = new Dog();
            myDog.Behavior(); //输出: "狗我晚上睡觉,白天活动" 
就把具体的狗,抽象成了动物
操作是对动物进行的,并不去管 myDog 是
IAnimal myDog = new Dog();
还是
IAnimal myDog = new Cat();
得来的


首先要非常感谢您的解答。
但我还是体会不到使用接口的作用和妙处,2种方法同样可以实现目的,能否给出一个例子体现接口的作用, C# 接口的作用

#18


引用 17 楼 zdhlwt2008 的回复:
Quote: 引用 16 楼 xuzuning 的回复:

C# 接口作用的深入理解



引用 16 楼 xuzuning 的回复:
       Dog myDog = new Dog(); 
       myDog.Behavior(); //输出: "我晚上睡觉,白天活动" 
就和你自己说的一样:不使用接口也同样可以达到目的:只需要在类中定义该方法
那么 public class Dog : IAnimal 中
IAnimal 在这里的作用仅仅是限定你必须书写一个 Dog.Behavior 方法,仅此而已

            IAnimal myDog = new Dog();
            myDog.Behavior(); //输出: "狗我晚上睡觉,白天活动" 
就把具体的狗,抽象成了动物
操作是对动物进行的,并不去管 myDog 是
IAnimal myDog = new Dog();
还是
IAnimal myDog = new Cat();
得来的


首先要非常感谢您的解答。
但我还是体会不到使用接口的作用和妙处,2种方法同样可以实现目的,能否给出一个例子体现接口的作用, C# 接口的作用

楼主明显就是想的多,写的少,才会有这种那种的疑问
如果楼主现在去学习设计模式 我估计疑问会更多

多写 多实践 

#19


路过学习。。。。。。。。。。。。。。。。。。。。。。

#20


接口解除业务之间的强耦合。接口的调用者只关注接口,而不关注它的具体类型;接口的实现者只管实现接口中规定的功能,不关心接口是被谁来调用。

以上是抽象的说明。以下举例说明:
把我国民用电力规范作为一个接口:220V、50Hz 的正弦交流电
作为电力(也就是接口)的调用方,有电视机、洗衣机、冰箱、电脑……,它不关心插板上的电是哪里来的,只关注接口中定义的规范
作为电力(还是接口)的提交方,有火力、太阳能、柴油机、水力、人力发电厂,它不关心谁来用它产生的电源,只按照规范提供电力

再一个模型:
interface 员工 {
    void 工作();
}

class 会计 : 员工 {
    public void 工作() {
        会议要做的工作,比如算账
    }
}

class 程序员 : 员工 {
    public void 工作(){
        程序员要做的工作,比如写程序,改bug
    }
}

class 清洁工 : 员工 {
    public void 工作(){
        打扫卫生
    }
}

public class 老板 {
    private 员工[] Employees = ......
    public void 开大会(){
        开会
        foreach(员工 emp : this.Employees){
            emp.工作();
        }
    }
}
老板只会对员工说,你去工作吧!
也就是说调用了员工的“工作”方法
但是工作如何做,与员工的具体类型(清洁工、程序员、会计)有关,但老板不关心这些具体类型。员工也只管作工作。

#21


首先楼主举的这个例子,用接口是不合适的,此处适合用继承,而不是接口。因为例子中有明显的父类和子类的特征。
动物是对猫狗的泛化。

其次,接口有一点,在C#里是其他功能都替代不了的,就是某种程度的“多继承”。在C#中只能实现单继承。

#22


引用 21 楼 daixf_csdn 的回复:
首先楼主举的这个例子,用接口是不合适的,此处适合用继承,而不是接口。因为例子中有明显的父类和子类的特征。
动物是对猫狗的泛化。

其次,接口有一点,在C#里是其他功能都替代不了的,就是某种程度的“多继承”。在C#中只能实现单继承。


估计楼主的那段代码是从书上或者老师那里复制来的
这段代码只能说明一下接口怎么用,对新手来讲,确实会让人觉得多此一举

#23


实际上,动物是个说明接口使用的很好的例子,因为动物世界够复杂,刚好可以用全继承和接口。简单写点:

    public class 动物
    {
        public virtual void 进食()
        {
        }

        public virtual void 繁殖()
        {
        }
    }

public interface I哺乳类
    {
        void 哺乳();
    }

    public interface I灵长类
    {
        void 使用工具();
    }

    public interface I人类
    {
        void 政治活动();
    }

    public class 狗 : 动物, I哺乳类
    {
        public override void 进食()
        {
            base.进食();
        }

        public override void 繁殖()
        {
            base.繁殖();
        }

        public void 哺乳()
        {
        }
    }

    public class 大猩猩:动物, I哺乳类, I灵长类
    {
        public void 哺乳()
        {
        }
 
        public void 使用工具()
        {
        }
    }

    public class 人:动物, I哺乳类, I灵长类, I人类
    {
        public void 哺乳()
        {
        }

        public void 使用工具()
        {
        }

        public void 政治活动()
        {
        }
    }

#24


上面这个代码,其实还有点瑕疵,就是接口之间,也应该继承,I人类继承自I灵长类,I灵长类继承I哺乳类

#25


引用 23 楼 daixf_csdn 的回复:
实际上,动物是个说明接口使用的很好的例子,因为动物世界够复杂,刚好可以用全继承和接口。简单写点:


例子是不错
但是不能解决楼主的疑惑
楼主是不明白,为什么不直接 new 一个对象,而要整出个接口出来

#26


1# 正解,ps:做小项目的话,接口不需要了解。

#1


        //公共接口: "动物" 
        public interface IAnimal
        {
            void Behavior(); //行为方法,描述各种动物的特性 
        }
 
        //类: 狗 
        public class Dog : IAnimal
        {
            public void Behavior()
            {
                Console.WriteLine(name() + "我晚上睡觉,白天活动");
            }
            string name()
            {
                return "狗";
            }
        }
 
        //类: 猫 
        public class Cat : IAnimal
        {
            string info = "猫";
            public void Behavior()
            {
                Console.WriteLine(info + "我白天睡觉,晚上活动");
            }
        }
        //简单的应用: 
        static void Main(string[] args)
        {
            IAnimal myDog = new Dog();
            myDog.Behavior(); //输出: "狗我晚上睡觉,白天活动" 
            IAnimal myCat = new Cat();
            myCat.Behavior(); //输出: "猫我白天睡觉,晚上活动" 

        }
这才是接口的作用
无论 Dog 和 Cat 是如何的不同,只要他实现了 IAnimal 接口
我们就可以通过 Behavior 方法进行相关操作,并不需要去管他们内部是如何做的

#2


#3


引用 1 楼 xuzuning 的回复:
        //公共接口: "动物" 
        public interface IAnimal
        {
            void Behavior(); //行为方法,描述各种动物的特性 
        }
 
        //类: 狗 
        public class Dog : IAnimal
        {
            public void Behavior()
            {
                Console.WriteLine(name() + "我晚上睡觉,白天活动");
            }
            string name()
            {
                return "狗";
            }
        }
 
        //类: 猫 
        public class Cat : IAnimal
        {
            string info = "猫";
            public void Behavior()
            {
                Console.WriteLine(info + "我白天睡觉,晚上活动");
            }
        }
        //简单的应用: 
        static void Main(string[] args)
        {
            IAnimal myDog = new Dog();
            myDog.Behavior(); //输出: "狗我晚上睡觉,白天活动" 
            IAnimal myCat = new Cat();
            myCat.Behavior(); //输出: "猫我白天睡觉,晚上活动" 

        }
这才是接口的作用
无论 Dog 和 Cat 是如何的不同,只要他实现了 IAnimal 接口
我们就可以通过 Behavior 方法进行相关操作,并不需要去管他们内部是如何做的

如果这样写的话估计楼主更加困惑了 为啥不直接Cat cat=new Cat(); 非要IAnimal cat=new Cat();
接口的作用就是 功能模块对接 人家名字都叫“接口”了吗。那么如何对接呢?
要有一个标准,大家都去遵循这个标准就ok了是吗。
那么问题来了 啥时候要用这个接口呢??
当你写业务需要有个动物的行为的方法,这个方法肯定是要的,但是目前没有想好如何写,并且不同的动物有各自的行为。那么这个时候动物各自的行为让每个动物类自己去实现,你只要把这个行为的接口预留出来,到时候和那个动物类对接就自动去这个动物类的行为方法不是很完美吗!!
就好比你电脑主板上有个显卡插槽就是 接口 先预留着 你买那个显卡是你自己的事情,到时候显卡一插 就等于对接了 。这下明白了吧!!!

#4


接口的实际运用应该以参数传递更加好理解 

public interface IAnimal
        {
            void Behavior(); 
        }
  
       
        public class Dog : IAnimal
        {
            public void Behavior()
            {
                Console.WriteLine(name() + "我晚上睡觉,白天活动");
            }
            string name()
            {
                return "狗";
            }
        }
  

        public class Cat : IAnimal
        {
            string info = "猫";
            public void Behavior()
            {
                Console.WriteLine(info + "我白天睡觉,晚上活动");
            }
        }
       
       public class AnimalBehavior
      {
             void StartBehavior(IAnimal animal)
             {
                      animal.Behavior();// 这里你别管是猫还是狗 就是要先定好这个方法
             }

              void RefBeh()
             {
                      AnimalBehavior ab=new ......

                      ab.StartBehavior(new Car());// 让猫叫 把猫对接上
                      ab.StarBehavior(new Dog());//同样 要让狗叫 把狗对接上
             }
      }
[/code]

这才是接口 真正的用处
类似于委托,只不过 接口是把多个函数 作为一个对象来传递而已。

#5


3L最后拿电脑显卡插口举例相当形象。顶一个。

#6


不使用接口,作者大概也会使用一个 abstract class 或者普通的可继承的 class 来定义 Animal。

所以这里的关键不是“接口”这个术语,而是“继承”这个目的。

代码中使用 Behavior 这个空洞的词儿,容易让人产生一种不信任感、反感,如果换成一个对设计有具体意义的词儿(例如“Eat”,或者根据它的领域设计需求而增加“骨骼数量”的特性)那么就比较容易明白其“自然的”对应概念。

在设计中我们把所有需要具体类型中抽象出来的东西都叫做接口,于是具体类型的父类的特性就是接口特性。子类对象从父类对象中继承了一些功能设计(从而不需要为子类对象单独设计这方面的操作细节)。例如一旦我们说“张柏芝是个母亲”,我们就知道“母亲”可以做什么事、享受什么待遇。继承与多态是一个问题的两面,我们使用继承的目的,也就是为了使用多态;反之亦然。

在 .net 中(在java中也是如此)是不支持class 的多重继承的。如果支持多重继承,那么根本不需要 interface 这种东西。可惜不支持多重继承,于是就只好用 interface 来模拟多重继承。因此假设一个 Cat 它既是 Animal 同时又是 Spirit,甚至同时又是“顾客”(例如用在宠物店软件系统中),那么Cat 的两个设计上的父类,最多只有一个可以在 c# 实现为 class,其它的都必须实现为 interface。但是本质上,在设计中不应该过分强调 interface 与 abstract class 的区别,所有的 interface 都可以看你做class、所有的class都可以看做一种 interface。

说 Cat 类型继承了 Animal 类型的特征,千万不要用很俗的“一个 Cat 内部有一个 Animal” 这种话。继承是指概念上的继承,一个 Cat 本身“就是”一个 Animal,而不是很俗地去理解接口概念。这里的重点是“is_a”而不是“has_a”关系,有的人把接口解释为“has_a”就会在随后的设计和实现中落入错误的泥潭,因为他可能设计程序时走了很久、一直在黑暗中,从一开始就没有明白区分这一点。

#7


那么Cat 的两个设计上的父类   -->   那么Cat 的所有设计上的父类

接口的作用,应该从“图上”去理解,一般人应该先学会画图,然后才动手写代码。如果你什么都是使用代码来理解,代码是最低级的东西,那你就容易认为“完全体现不到作用”。

在设计上,它会分为两个层次。一个层次是仅仅涉及到 Animal 世界的蓝图。然后另外一个层次的设计图才会分别涉及到各个子类的细节。这里是分层隔离的,用不同层次的蓝图,就简化了系统设计,因为所有低层次的类型都可以通过高层次的父类的设计图来与相关外界对象通讯,而不需要在低层次的图纸中再次画一遍这些接口需求。

#8


接口的作用是规范。
继承该接口,就必须实现其中的方法。
作用就是让有相同行为的同一类事物,都去实现他们的类似行为。
说白了,就是 狗和猫,都需要吃东西,那么他们继承动物接口,动物接口定义吃的方法。狗和猫分别实现狗吃狗粮,猫吃猫粮。但是他们实现的内容是不同的。可是他们必须实现动物中这个吃东西的方法。这就是规范。
比如电脑就不用继承这个动物的接口。因为电脑不需要吃东西。但是电脑可能会继承  机械 这个接口。
接口,就是定义一类事物的相同行为。这就是规范 C# 接口的作用

#9


引用 5 楼 ajh99990 的回复:
3L最后拿电脑显卡插口举例相当形象。顶一个。

+1

#10


引用 8 楼 hanjun0612 的回复:
接口的作用是规范。
继承该接口,就必须实现其中的方法。
作用就是让有相同行为的同一类事物,都去实现他们的类似行为。
说白了,就是 狗和猫,都需要吃东西,那么他们继承动物接口,动物接口定义吃的方法。狗和猫分别实现狗吃狗粮,猫吃猫粮。但是他们实现的内容是不同的。可是他们必须实现动物中这个吃东西的方法。这就是规范。
比如电脑就不用继承这个动物的接口。因为电脑不需要吃东西。但是电脑可能会继承  机械 这个接口。
接口,就是定义一类事物的相同行为。这就是规范 C# 接口的作用

接口的目的是  对接 对接 对接 不是标准 
现在很多人都说接口是标准那是错误的
应为要对接 你必须制定一样的标准才能对接上  所以才要有标准
  
比如 5mm的管子 和 10mm的管子对接 如果用8mm的接口   你的5mm管子口扩大到8mm  10mm的管子缩小到8mm  这样就能对接上了
所以记住接口是为了对接的口子,就是这么简单的道理。

#11


收回楼上的话,我说错了。

#12


不怎么使用接口

倒是通用业务模块的时候,在给二次开发留下余地的时候会用到

#13



引用 楼主 zdhlwt2008 的回复:
代码示例:

//公共接口: "动物" 
public interface IAnimal
 {
        void Behavior(); //行为方法,描述各种动物的特性 
}
 
//类: 狗 
public class Dog : IAnimal
{
        public void Behavior()
        {
               //Console.Write("我晚上睡觉,白天活动");
                MessageBox.Show("我晚上睡觉,白天活动");
         }
 }
 
//类: 猫 
public class Cat : IAnimal
{
      public void Behavior()
      {
                //Console.Write("我白天睡觉,晚上活动");
                MessageBox.Show("我白天睡觉,晚上活动");
       }
 }
//简单的应用: 
public static Main() 

       Dog myDog = new Dog(); 
       myDog.Behavior(); //输出: "我晚上睡觉,白天活动" 
       Cat myCat = new Cat(); 
       myCat.Behavior(); //输出: "我白天睡觉,晚上活动" 
}


该实例使用了Animal这个接口,但是我不使用接口也同样可以达到目的:只需要在类中定义该方法,在主函数中实例化一个对象,然后调用它结果也是一样,这样一来接口不是多此一举,完全体现不到接口的作用吗?还请各位帮忙解答小弟的疑问,不甚感激。


你这个和我写的那个感觉没有多大区别呢。请指教。

#14


引用 13 楼 zdhlwt2008 的回复:
...
你这个和我写的那个感觉没有多大区别呢。请指教。


public static void Main()
{
    IAnimal[] 宠物们 = { new Dog(), new Cat() };  // 这里宠物们就是泛指,不能用Dog[],也不能用Cat[]
    foreach(var 宠物 in 宠物们)
    {
        宠物.Behavior();
    }
}

#15


引用 2 楼 xunzaosiyecao 的回复:
C# 接口作用的深入理解


       
      static void Main(string[] args)
        {
            IAnimal myDog = new Dog();
            myDog.Behavior(); //输出: "狗我晚上睡觉,白天活动" 
            IAnimal myCat = new Cat();
            myCat.Behavior(); //输出: "猫我白天睡觉,晚上活动" 
 
        }


//简单的应用: 
public static Main() 

       Dog myDog = new Dog(); 
       myDog.Behavior(); //输出: "我晚上睡觉,白天活动" 
       Cat myCat = new Cat(); 
       myCat.Behavior(); //输出: "我白天睡觉,晚上活动" 
}


这两段代码有和区别,实现的效果一样啊,有和区别,请指教,万分感谢!

#16


       Dog myDog = new Dog(); 
       myDog.Behavior(); //输出: "我晚上睡觉,白天活动" 
就和你自己说的一样:不使用接口也同样可以达到目的:只需要在类中定义该方法
那么 public class Dog : IAnimal 中
IAnimal 在这里的作用仅仅是限定你必须书写一个 Dog.Behavior 方法,仅此而已

            IAnimal myDog = new Dog();
            myDog.Behavior(); //输出: "狗我晚上睡觉,白天活动" 
就把具体的狗,抽象成了动物
操作是对动物进行的,并不去管 myDog 是
IAnimal myDog = new Dog();
还是
IAnimal myDog = new Cat();
得来的

#17


引用 16 楼 xuzuning 的回复:
C# 接口作用的深入理解



引用 16 楼 xuzuning 的回复:
       Dog myDog = new Dog(); 
       myDog.Behavior(); //输出: "我晚上睡觉,白天活动" 
就和你自己说的一样:不使用接口也同样可以达到目的:只需要在类中定义该方法
那么 public class Dog : IAnimal 中
IAnimal 在这里的作用仅仅是限定你必须书写一个 Dog.Behavior 方法,仅此而已

            IAnimal myDog = new Dog();
            myDog.Behavior(); //输出: "狗我晚上睡觉,白天活动" 
就把具体的狗,抽象成了动物
操作是对动物进行的,并不去管 myDog 是
IAnimal myDog = new Dog();
还是
IAnimal myDog = new Cat();
得来的


首先要非常感谢您的解答。
但我还是体会不到使用接口的作用和妙处,2种方法同样可以实现目的,能否给出一个例子体现接口的作用, C# 接口的作用

#18


引用 17 楼 zdhlwt2008 的回复:
Quote: 引用 16 楼 xuzuning 的回复:

C# 接口作用的深入理解



引用 16 楼 xuzuning 的回复:
       Dog myDog = new Dog(); 
       myDog.Behavior(); //输出: "我晚上睡觉,白天活动" 
就和你自己说的一样:不使用接口也同样可以达到目的:只需要在类中定义该方法
那么 public class Dog : IAnimal 中
IAnimal 在这里的作用仅仅是限定你必须书写一个 Dog.Behavior 方法,仅此而已

            IAnimal myDog = new Dog();
            myDog.Behavior(); //输出: "狗我晚上睡觉,白天活动" 
就把具体的狗,抽象成了动物
操作是对动物进行的,并不去管 myDog 是
IAnimal myDog = new Dog();
还是
IAnimal myDog = new Cat();
得来的


首先要非常感谢您的解答。
但我还是体会不到使用接口的作用和妙处,2种方法同样可以实现目的,能否给出一个例子体现接口的作用, C# 接口的作用

楼主明显就是想的多,写的少,才会有这种那种的疑问
如果楼主现在去学习设计模式 我估计疑问会更多

多写 多实践 

#19


路过学习。。。。。。。。。。。。。。。。。。。。。。

#20


接口解除业务之间的强耦合。接口的调用者只关注接口,而不关注它的具体类型;接口的实现者只管实现接口中规定的功能,不关心接口是被谁来调用。

以上是抽象的说明。以下举例说明:
把我国民用电力规范作为一个接口:220V、50Hz 的正弦交流电
作为电力(也就是接口)的调用方,有电视机、洗衣机、冰箱、电脑……,它不关心插板上的电是哪里来的,只关注接口中定义的规范
作为电力(还是接口)的提交方,有火力、太阳能、柴油机、水力、人力发电厂,它不关心谁来用它产生的电源,只按照规范提供电力

再一个模型:
interface 员工 {
    void 工作();
}

class 会计 : 员工 {
    public void 工作() {
        会议要做的工作,比如算账
    }
}

class 程序员 : 员工 {
    public void 工作(){
        程序员要做的工作,比如写程序,改bug
    }
}

class 清洁工 : 员工 {
    public void 工作(){
        打扫卫生
    }
}

public class 老板 {
    private 员工[] Employees = ......
    public void 开大会(){
        开会
        foreach(员工 emp : this.Employees){
            emp.工作();
        }
    }
}
老板只会对员工说,你去工作吧!
也就是说调用了员工的“工作”方法
但是工作如何做,与员工的具体类型(清洁工、程序员、会计)有关,但老板不关心这些具体类型。员工也只管作工作。

#21


首先楼主举的这个例子,用接口是不合适的,此处适合用继承,而不是接口。因为例子中有明显的父类和子类的特征。
动物是对猫狗的泛化。

其次,接口有一点,在C#里是其他功能都替代不了的,就是某种程度的“多继承”。在C#中只能实现单继承。

#22


引用 21 楼 daixf_csdn 的回复:
首先楼主举的这个例子,用接口是不合适的,此处适合用继承,而不是接口。因为例子中有明显的父类和子类的特征。
动物是对猫狗的泛化。

其次,接口有一点,在C#里是其他功能都替代不了的,就是某种程度的“多继承”。在C#中只能实现单继承。


估计楼主的那段代码是从书上或者老师那里复制来的
这段代码只能说明一下接口怎么用,对新手来讲,确实会让人觉得多此一举

#23


实际上,动物是个说明接口使用的很好的例子,因为动物世界够复杂,刚好可以用全继承和接口。简单写点:

    public class 动物
    {
        public virtual void 进食()
        {
        }

        public virtual void 繁殖()
        {
        }
    }

public interface I哺乳类
    {
        void 哺乳();
    }

    public interface I灵长类
    {
        void 使用工具();
    }

    public interface I人类
    {
        void 政治活动();
    }

    public class 狗 : 动物, I哺乳类
    {
        public override void 进食()
        {
            base.进食();
        }

        public override void 繁殖()
        {
            base.繁殖();
        }

        public void 哺乳()
        {
        }
    }

    public class 大猩猩:动物, I哺乳类, I灵长类
    {
        public void 哺乳()
        {
        }
 
        public void 使用工具()
        {
        }
    }

    public class 人:动物, I哺乳类, I灵长类, I人类
    {
        public void 哺乳()
        {
        }

        public void 使用工具()
        {
        }

        public void 政治活动()
        {
        }
    }

#24


上面这个代码,其实还有点瑕疵,就是接口之间,也应该继承,I人类继承自I灵长类,I灵长类继承I哺乳类

#25


引用 23 楼 daixf_csdn 的回复:
实际上,动物是个说明接口使用的很好的例子,因为动物世界够复杂,刚好可以用全继承和接口。简单写点:


例子是不错
但是不能解决楼主的疑惑
楼主是不明白,为什么不直接 new 一个对象,而要整出个接口出来

#26


1# 正解,ps:做小项目的话,接口不需要了解。