设置变量或对象的概念是什么,或者我不知道当我创建类的实例并将接口的名称放在左手边时它被称为什么,我知道我们不能创建接口类型的对象。
只有当我声明这些类型的对象时,我需要更多澄清这个过程的名称或.Net 所做的细节。
IDataReader oSQLReader = new SqlDataReader();
IDataReader oOLEReader = new OleDbDataReader();
设置变量或对象的概念是什么,或者我不知道当我创建类的实例并将接口的名称放在左手边时它被称为什么,我知道我们不能创建接口类型的对象。
只有当我声明这些类型的对象时,我需要更多澄清这个过程的名称或.Net 所做的细节。
IDataReader oSQLReader = new SqlDataReader();
IDataReader oOLEReader = new OleDbDataReader();
究竟发生了什么是您正在创建特定类的实例,然后您正在向上转换对接口类型的引用。
引用的类型定义了您可以在实例中访问的内容。您只能使用接口知道的类的成员。
对象的实际类型仍然是您创建的实例的类型,因此您可以再次向下转换对该类型的引用:
SqlDataReader reader = (SqlDataReader)oSQLReader;
概念很简单:
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
这就是多态性。
这里的概念是为了完成“编程到接口,而不是实现”的设计原则。
这里的接口可以是抽象类,也可以是实际的接口。具体类将具有通过接口暴露给外界的实际实现。客户端代码将使用接口访问功能,防止他们直接创建具体类的对象,只是通过接口对象授予他们访问权限。
我相信这是通过 OO 设计模式实现的。