█■为啥要用实现接口的类实例化接口呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了█■为啥要用实现接口的类实例化接口呢?相关的知识,希望对你有一定的参考价值。

为什么要用实现接口的类实例化接口呢?
这样做有什么用?

其实没有太大意义的,个人爱好而已。

不过有些时候,可以用到类用不到的。举个例子
Colletions.sort(List list)这个可以很方便的对List进行排序
如果你声明成List list = new ArrayList();
那么你就可以直接调用Collections.sort(list)进行排序,尽管运行的时候实例是ArrayList
但是如果你声明为ArrayList list = new ArrayList();
如果用Collections.sort(list)就会引起编译错误。
参考技术A 实现接口的类 实例 = new 实现接口的类()// 这样用不好吗?

//这样已经不是好不好的问题了,这样的话,要接口有什么用?
//用接口就是让实例和实现类的耦合度降低。
//让程序更加容扩展。

以下是问题之外的知识,想看可以往下,不想看跳过。

接口 实例 = new 实现接口的类A()
接口 实例 = new 实现接口的类B()
接口 实例 = new 实现接口的类C()
这样的逻辑就是说,我们需要某个类,所以我们每次实例化它。

如果把 ABC这三个类,再用一个类封D装起来,会怎么样呢?

接口 实例 = D.A
接口 实例 = D.B
接口 实例 = D.C

我们还是需要某个类,但是,我们不需要每次都实例化了,只需要找D“拿”就行。

==========晕,不知不觉写了这么多,至于扩展性,你自己想吧======
TIPS:工厂模式。
myblog :本回答被提问者采纳

类继承接口使用接口实例化 与 使用类实例化

一、
接口不能实例化,用接口的实现类可以实例化,将实现类的对象在内存中的地址指向接口,这个接口就可以使用了
二、
实现接口的类 实例 = new 实现接口的类()// 这样用不好吗?

//这样已经不是好不好的问题了,这样的话,要接口有什么用?
//用接口就是让实例和实现类的耦合度降低。
//让程序更加容扩展。

以下是问题之外的知识,想看可以往下,不想看跳过。

接口 实例 = new 实现接口的类A() 
接口 实例 = new 实现接口的类B() 
接口 实例 = new 实现接口的类C() 
这样的逻辑就是说,我们需要某个类,所以我们每次实例化它。

如果把 ABC这三个类,再用一个类封D装起来,会怎么样呢?

接口 实例 = D.A
接口 实例 = D.B
接口 实例 = D.C

我们还是需要某个类,但是,我们不需要每次都实例化了,只需要找D“拿”就行。

嗯,这就是工厂模式的来由!!!!

C# 实例化接口对象的方法

在head first 设计模式中 用到了很多很多接口对象

首先澄清一个问题,就是接口不仅可以声明对象,而且可以把对象实例化,还可以当做参数被传入。

一、接口回调

这就是继承中的向上转型。父类 FL=new 子类();只不过这里的父类就是interface接口。(个人认为这里不管是class的override还是interface的重写,都是一样的用法)

可以把实现某一接口类创建的对象的引用赋给该接口声明的接口变量,那么该 接口变量就可以调用被类实现的接口中的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口方法

直接上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
  interface Itemp
  {
    double plus();
  }
  public class num : Itemp
  {
    double aa, bb;
    public num(double a, double b)
    {
      this.bb = b;
      this.aa = a;
    }
    public double plus()
    {
      return (aa * bb);
    }
  }
  class Program
  {
    static void Main(string[] args)
    {
      num n = null;//声明类对象引用
      Itemp tm = null;//声明接口对象引用
      tm = new num(1.1, 2.2);//接口回调(向上转型)
      Console.WriteLine(tm.plus());
      Console.ReadKey();
    }
  }
}

通过上面的例子,我们不难看出,接口对象的实例化实际上是一个接口对象作为一个引用,指向实现了它方法的那个类中的所有方法,这一点非常象C++中的函数指针(在C#中类似委托),但是却是有区别的。C#中的接口对象实例化实际上是一对多的,而C++中的函数指针是一对一的。

但是需要注意的是,接口对象的实例化必须用实现它的类来实例化,而不能用接口本身实例化。用接口本身实例化它自己的对象在C#中是不允许的。













以上是关于█■为啥要用实现接口的类实例化接口呢?的主要内容,如果未能解决你的问题,请参考以下文章

C#为啥接口可以实例化一个实现该接口的类?

类继承接口使用接口实例化 与 使用类实例化

动态实例化实现接口并调用接口方法的类

接口可以实例化吗

为啥我在实例化接口时会出错?

一个类实现两个接口,如何用spring实例化