通过其接口访问对象

时间:2015-06-03 05:17:26

标签: c# interface

这究竟是什么意思?我正在阅读设计模式书。它说 对象只能通过他们的界面访问,我无法理解它,有些身体可以给我一些例子(如果它在C#中真的很感激)

使用它我们真正实现了什么?

由于

5 个答案:

答案 0 :(得分:2)

如果你有一个名为Espson的类并且它实现了一个名为IPrinter的接口,那么你可以通过它的接口实例化该对象。

IPrinter printer = new Espson();

Epson可能有许多不属于IPrinter界面的方法,但您可能不在乎。您可能想要做的就是调用名为IPrinter

Print接口中定义的方法

那么我可以将类传递给一个名为PrintDocument(IPrinter printer)的方法,该方法并不关心它是什么类型的打印机,它只知道它有一个名为Print的方法

答案 1 :(得分:2)

问题是界面有几个含义。在这种情况下,作者正在谈论必须通过公共方法(也在C#中通过公共属性)访问对象。

(当然,继承者可以使用受保护的方法)。

公共方法/属性构成了类的公共接口。它与C#中interface关键字描述的界面不同。

答案 2 :(得分:1)

这真的取决于。如果变量的类型为" interface",那么在这种情况下,对象只能通过接口类型访问。

让我们考虑一个例子 - 假设我有一个如下定义的接口 -

interface IMyInterface
{
   string B();
}

如果我使用类" MyClass"来实现这个接口如下所示 -

public class MyClass:IMyInterface
   {
      public string B()
      { 
           return "In Class";
      }
   }

   public class MyAnotherClass:IMyInterface
       {
          public string B()
          { 
               return "In Another Class";
          }
       }

我使用界面创建了一个类的实例,如下所示

   IMyInterface myinst = new MyClass();

然后在上面的例子中,我只能使用变量 myinst 访问方法B(),其中包含对 MyClass 类型的引用。

进一步说,让我说我有一个方法,它采用IMyInterface类型的参数,如下所示 -

    public class UseOfInterface{
    public void InterfaceUse(IMyInterface myPara)
    {
      myPara.B();
    }
}

我将此方法称为如下所示 -

        IMyInterface myInst = new MyClass();
        IMyInterface myAnotherInst = new MyAnotherClass();

        UseOfInterface interfaceUse = new UseOfInterface();
        interfaceUse.InterfaceUse(myInst); // returns "In Class"
        interfaceUse.InterfaceUse(myAnotherInst); // returns "In Another Class"

然后,如上所示,在运行时决定使用Interface变量调用哪个方法。

但是如果我创建了一个 MyClass 类型的变量,它将包含MyClass类型的引用,如下所示 -

   MyClass myinst = new MyClass();

然后可以使用MyClass实例访问方法B()。因此,这取决于您正在处理的场景类型。

编辑:为什么要使用界面?

使用接口的主要原因是它提供了与实现它的类的契约,而不是C#中的多继承支持。让我们看一下合同提供可能有用的例子。

假设你有一个班级 - " Car"在您希望公开公开的程序集中,该类的定义如下所示

namespace CarNameSpace
{
   public class Car()
   {
      public void Drive(IDriver driver)
      {
         if(driver.Age > 18)
         {
            driver.Drive();
         }
      }
   }
}

如上所示,任何实施 IDriver 界面的人都可以开车,定义如下:

interface IDriver
{
   string Age{get; set;}
   string Name {get set;}
   string Drive()
}

反过来驾驶我的车我会将IDriver接口暴露给外部世界,所以实现我的界面的任何人都可以调用 Car的驱动器方法,不会关于他如何开车如下图所示

public class PerfectDriver:IDriver
{
   public PerfectDriver()
   {
     Name = "Vikram";
     Age = 30;
   }
   public int Age{get; set;}
   public string Name {get; set;}
   public string Drive()
   {
      return "Drive's perfectly";
   }
}

可以使用 Car 类,如下所示

  PerfectDriver perf = new PerfectDriver
  Car myCar = Car();  
  myCar.Driver(perf);

答案 3 :(得分:0)

接口是描述对象公共成员签名的构造。它包含保证在实现该接口的任何对象上出现的属性,方法和事件的声明(仅声明,无实现)。

这是一个简单的界面和几个实现它的类。界面" INamed"简单地说,实现界面的对象具有" Name"属性为字符串。

public interface INamed{
    string Name{get;}
}

public class Person : INamed{
    public string Name{get;set;}
}

public class Place : INamed{
    public string Name{get;set;}
}

public class Thing : INamed{
    public string Name{get;set;}
}

...这是一个接受该接口类型参数的简单方法。

static void PrintName(INamed namedObject){
    Console.WriteLine(namedObject.Name);
}

这" PrintName" method可以接受实现该接口的任何类型的参数。 "通过界面访问对象的优势"是它以一定的灵活性注入你的应用程序,访问这些接口而不是它们的具体类型允许你操作这些对象而不必知道它们到底是什么。

例如,我可以选择在IDbCommand接口上操作,而不是使用具体的SqlCommand,在使用各种数据库提供程序时,以这种方式编写的大部分内容都很有用。

简单的想法是,你不需要知道你是否在汽车或船上,因为你可以用车轮和踏板开车。

答案 4 :(得分:0)

接口指的是对象向对象的用户公开的内容。对象将是一个类的实例,它将具有自己的接口,并可能实现一个或多个其他接口。

虽然诸如C#之类的语言允许您定义称为接口的东西,但它们与语句中引用的接口不同,即通过接口访问对象。例如,在Scala等语言中,C#调用接口的内容称为特征。大多数设计模式都涉及使用已定义的接口,即public interface <interface name>,但同样,这些接口与原始陈述中的含义不同。

假设我在C#中定义了以下类:

public class MyType
{
  public void Method1()
  {
    ...
  }

  private void Method2()
  {
    ...
  }

  public int Method3()
  {
    ...
  }
}

然后,我与该类交互的接口是它公开的两个方法void Method1int Method2以及隐式无参数构造函数。

现在,假设我定义了以下接口和类:

public interface IInterface1
{
    void Method1();
}

public interface IInterface2
{
    int Method3();
}

public class MyType2 : IInterface1, IInterface2
{
  public void Method1()
  {
    ...
  }

  private void ADifferentMethod()
  {
    ...
  }

  public int Method3()
  {
    ...
  }
}

用户与MyType2实例交互的接口与用户通过MyType1实例交互的接口(除了不同的构造函数)相同,因为公共方法的签名(和其他公开成员)完全相同:void Method1int Method3