【问题标题】:What is the concept of creating class instance using interface name?使用接口名称创建类实例的概念是什么?
【发布时间】:2013-06-20 06:46:00
【问题描述】:

集合变量或对象的概念是什么,或者我不知道当我创建类的实例并将接口的名称放在左手边时它被称为什么,我知道我们不能创建和对象类型接口。

只有当我声明这些类型的对象时,我需要进一步澄清这个过程的名称或 .Net 所做的细节。

IDataReader oSQLReader = new SqlDataReader();
IDataReader oOLEReader = new OleDbDataReader();

【问题讨论】:

  • 试试看Polymorphism
  • 这是基本的OO实践,您将编写仅使用接口类型作为形式参数的方法,而不关心作为实际参数传递的具体对象。这样做的原因是,如果稍后您决定使用另一个具体类,例如 OracleDataReader,您将不需要更改仅处理 IDataReader 的方法或代码中的任何内容。
  • 感谢大家的回复,是的,我知道那是多态性,但我们称之为这一步?
  • 我的意思是当我制作 SqlDataReader oSqlDataReader = new SqlDataReader() 时,我们说我们创建了 SqlDataReader 类型的新对象,当我们制作 IDataReader oSqlDataReader = new SqlDataReader();我们不能说我们创建了 IDataReader 类型的对象...@Davide Piras

标签: c# .net interface object-oriented-analysis


【解决方案1】:

具体发生的情况是您正在创建特定类的实例,然后您正在向上转换对接口类型的引用。

引用的类型定义了您可以在实例中访问的内容。您只能使用接口知道的类的成员。

对象的实际类型仍然是您创建的实例的类型,因此您可以再次向下转换对该类型的引用:

SqlDataReader reader = (SqlDataReader)oSQLReader;

【讨论】:

  • 我从这个答案中了解到,如果我们有接口包含两个方法 GetName();和获取ID();我们有实现这个接口的类,还有另一个名为 GetGender() 的方法;如果我们使用向上转换方法创建对象,我们只能访问使用接口隐含的方法.. 对吗? @Guffa,感谢您的回答,我现在将通过示例进行尝试:)
  • @KhaledQuestions:是的,这是正确的。要访问存在于类中但不存在于接口中的成员,您需要向下转换引用(或将其转换为该类也实现并定义该成员的不同接口)。
【解决方案2】:

概念很简单:

public class Cat : IAnimal {
     public void Voice() {//implements IAnimal's method
         Console.WriteLine("Miyaoo");
     }
}

public class Dog: IAnimal {
     public void Voice() {  //implements IAnimal's method
         Console.WriteLine("Woof");
     }
}

public interface IAnimal {
      public void Voice();
}

初始化后

IAnimal animal1 = new Cat(); 
IAnimal animal2 = new Dog(); 

在代码中的某处

public void MakeAnimalSound(IAnimal animal) {
   animal.Voice(); 
}

所以你可以这样做:

MakeAnimalSound(animal1); //prints "Mew" even if type is IAnimal
MakeAnimalSound(animal2); //prints "Woof" even if type is IAnimal

这是多态性。

【讨论】:

    【解决方案3】:

    这里的概念是为了完成“编程到接口,而不是实现”的设计原则。

    这里的接口可以是抽象类,也可以是实际的接口。具体类将具有通过接口暴露给外界的实际实现。 客户端代码会通过接口访问功能,防止他们直接创建具体类的对象,只给他们通过接口对象访问。

    我相信这是通过 OO 设计模式实现的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多