我有一个类 CustomerNew
和一个接口(interface) ICustomer
:
public class CustomerNew : ICustomer
{
public void A()
{
MessageBox.Show("Class method");
}
void ICustomer.A()
{
MessageBox.Show("Interface method");
}
public void B()
{
MessageBox.Show("Class Method");
}
}
public interface ICustomer
{
void A();
}
我对这两行代码很困惑。
ICustomer objnew = new CustomerNew();
CustomerNew objCustomerNew = new CustomerNew();
objnew.B(); // Why this is wrong?
objCustomerNew.B(); // This is correct because we are using object of class
第一行代码意味着我们在 objnew
中传递 CustomerNew 类的对象引用,我说得对吗?如果是,那为什么我不能使用 interface objnew
访问类的方法 B()?
谁能详细解释一下这两个。
最佳答案
接口(interface)有许多特性和用途,但一个核心问题是能够在商定的契约(Contract)中向外界展示功能。
让我举个例子。考虑一台汽水自动售货机。它有一两个插槽供您投入硬币,几个按钮供您选择正确类型的苏打水和一个分配苏打水的按钮(除非选择按钮也可以)。
现在,这是一个界面。这隐藏了界面背后机器的复杂性,并为您提供了一些选择。
但是,这里是重要的部分,内部机器有很多功能,它甚至可能有其他按钮和旋钮,通常供维护人员在需要时测试或操作机器有什么不对劲,或者当他们为了钱而不得不清空它或装满苏打水时。
机器的这部分对你是隐藏的,你只能访问外部接口(interface)的创建者添加到该接口(interface)的任何内容。
你甚至不知道机器在幕后实际是如何运作的。我可以创建一个新的自动售货机,从附近的工厂传送苏打水,并将你直接添加的硬币传送到银行,你不会更聪明。更不用说我会很有钱了,但那是另一回事了。
那么,回到您的代码。
您将 objnew
显式声明为 ICustomer
。无论您将什么放在 后面,这个界面都是隐藏的。您只能访问声明为作为该接口(interface)的一部分的任何内容。
另一个变量被声明为具有底层对象的类型,因此您可以完全访问其所有公共(public)功能。可以把它想象成解锁自动售货机并在正面打开的情况下使用它。
关于c# - OOPS 概念 : What is the difference in passing object reference to interface and creating class object in C#?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30570185/