c# - OOPS 概念 : What is the difference in passing object reference to interface and creating class object in C#?

标签 c# class interface

我有一个类 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/

相关文章:

c# - Entity Framework 引用在调试和发布构建之间丢失

c# - 在 4 个位置实例化 4 个预制件,打乱顺序,Unity Engine C#

无法编辑实例属性的Python类

java - “找不到或加载主类”是什么意思?

c# - 类(class)边界

c# - 所有好友列表 C# Facebook SDK v5

c# - 为什么 IList<>.Reverse() 不像 List<>().Reverse 那样工作

linux - 在 Linux 中控制文本模式输出 | C/C++

java - 如何在java接口(interface)中创建变量

c# - 使用相同的 SqlConnection 对 SqlCommand.BeginExecuteNonQuery 的多个并发调用