OOPS概念:在C#中将对象引用传递给接口和创建类对象有什么区别?

高拉夫123

我有一个类,CustomerNew和一个接口,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

代码的第一行表示我们正在传递CustomerNew类的对象引用,对objnew吗?如果是,那么为什么我不能使用访问类的方法B()interface objnew

有人可以详细解释这两个问题吗?

MatíasFidemraizer

实际上,接口也是一种类型(您不能创建接口实例,因为它们只是元数据)。

由于CustomerNew工具ICustomer的一个实例CustomerNew可以upcastedICustomerCustomerNew键入作为ICustomer你只能访问ICustomer成员。

这是因为C#是一种强类型语言,因此,为了访问特定成员(即方法,属性,事件...),您需要一个对象引用,该对象引用必须通过定义要访问的成员的类型来限定(即,您需要将CustomerNew对象存储在类型的引用中CustomerNew以访问该方法B

更新

OP说:

因此,由于向上转换,我们只能访问接口内部的那些方法,对吗?升级背后的主要原因是什么?

是的。一个简单的解释是一个ICustomer不应强制实现的对象CustomerNew您需要向下转换ICustomer参考CustomerNew,以便能够访问CustomerNew成员。

由于类和接口都是类型,并且C#是强类型语言,因此您可以通过提供对象的实际类型来访问对象成员。这就是为什么需要使用强制转换的原因

例如,您的代码进行了隐式转换:

// This is an implicit cast that's equivalent to
// ICustomer objnew = (ICustomer)new CustomerNew()
ICustomer objnew = new CustomerNew();

隐upcasts是可能的,因为编译器已经知道CustomerNew器具ICustomer反思CustomerNew的元数据,虽然你不能implictly-垂头丧气的一个ICustomer参考,因为谁知道谁农具ICustomer它可以是CustomerNew任何其他类,甚至可以是结构:

ICustomer asInterface = new CustomerNew();

// ERROR: This won't compile, you need to provide an EXPLICIT DOWNCAST
CustomerNew asClass1 = asInterface;

// OK. You're telling the compiler you know that asInterface
// reference is guaranteed to be a CustomerNew too!
CustomerNew asClass2 = (CustomerNew)asInterface;

如果不确定anICustomer是a CustomerNew,则可以使用as运算符,该运算符在无法进行强制转换的情况下不会在运行时引发异常:

// If asInterface isn't also a CustomerNew, the expression will set null
CustomerNew asClass3 = asInterface as CustomerNew;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Java中将对象和原始数据作为参数传递有什么区别?

来自分类Dev

在Java中将对象和原始数据作为参数传递有什么区别?

来自分类Dev

C ++概念和Java接口之间有什么区别?

来自分类Dev

C ++概念和接口之间有什么区别?

来自分类Dev

C ++概念和Java接口之间有什么区别?

来自分类Dev

在C#中,对象是否有可能将对自身的引用传递给它在其自己的基本构造函数中创建的子对象的构造函数?

来自分类Dev

通过将模型类的实例传递给可比较对象来使用可比对象,并将包装器传递给可比较对象之间有什么区别?

来自分类Dev

接口和类有什么区别?

来自分类Dev

使用new Class()和new Class {}从类创建对象之间有什么区别?

来自分类Dev

类图和对象图有什么区别?

来自分类Dev

在Objective-C中将对象传递给另一个类的最佳方法是什么?

来自分类Dev

将对象引用传递给 Python 中的多个类

来自分类Dev

Objective-C对象中的* a和** a有什么区别?

来自分类Dev

抽象类的对象和抽象类的对象列表有什么区别?

来自分类Dev

如何在C#中将对象类型传递给Type参数

来自分类Dev

如何在WPF中将对象传递给按钮单击事件处理程序?C#

来自分类Dev

使用“ this”和对象名称在对象内部进行引用有什么区别?

来自分类Dev

将对象设置为.hidden = true和设置.alpha = 0有什么区别?

来自分类Dev

将函数传递给模板时,使用函数指针或对象有什么区别?

来自分类Dev

在C ++中将对象向量的引用作为参数传递

来自分类Dev

从OOP角度来看,动态多态性,抽象类和接口在C#中有什么区别?

来自分类Dev

将对象引用传递给方法

来自分类Dev

将对象数组的引用传递给函数

来自分类Dev

将对象属性的引用传递给方法

来自分类Dev

C#静态类:我应该将对象传递给构造函数吗?

来自分类Dev

C#静态类:我应该将对象传递给构造函数吗?

来自分类Dev

对象和JavaScript中的类中的对象有什么区别?

来自分类Dev

c#无法在具有多个通用参数的方法中将对象强制转换为接口

来自分类Dev

ZeroC ICE:接口和类之间有什么区别?

Related 相关文章

  1. 1

    在Java中将对象和原始数据作为参数传递有什么区别?

  2. 2

    在Java中将对象和原始数据作为参数传递有什么区别?

  3. 3

    C ++概念和Java接口之间有什么区别?

  4. 4

    C ++概念和接口之间有什么区别?

  5. 5

    C ++概念和Java接口之间有什么区别?

  6. 6

    在C#中,对象是否有可能将对自身的引用传递给它在其自己的基本构造函数中创建的子对象的构造函数?

  7. 7

    通过将模型类的实例传递给可比较对象来使用可比对象,并将包装器传递给可比较对象之间有什么区别?

  8. 8

    接口和类有什么区别?

  9. 9

    使用new Class()和new Class {}从类创建对象之间有什么区别?

  10. 10

    类图和对象图有什么区别?

  11. 11

    在Objective-C中将对象传递给另一个类的最佳方法是什么?

  12. 12

    将对象引用传递给 Python 中的多个类

  13. 13

    Objective-C对象中的* a和** a有什么区别?

  14. 14

    抽象类的对象和抽象类的对象列表有什么区别?

  15. 15

    如何在C#中将对象类型传递给Type参数

  16. 16

    如何在WPF中将对象传递给按钮单击事件处理程序?C#

  17. 17

    使用“ this”和对象名称在对象内部进行引用有什么区别?

  18. 18

    将对象设置为.hidden = true和设置.alpha = 0有什么区别?

  19. 19

    将函数传递给模板时,使用函数指针或对象有什么区别?

  20. 20

    在C ++中将对象向量的引用作为参数传递

  21. 21

    从OOP角度来看,动态多态性,抽象类和接口在C#中有什么区别?

  22. 22

    将对象引用传递给方法

  23. 23

    将对象数组的引用传递给函数

  24. 24

    将对象属性的引用传递给方法

  25. 25

    C#静态类:我应该将对象传递给构造函数吗?

  26. 26

    C#静态类:我应该将对象传递给构造函数吗?

  27. 27

    对象和JavaScript中的类中的对象有什么区别?

  28. 28

    c#无法在具有多个通用参数的方法中将对象强制转换为接口

  29. 29

    ZeroC ICE:接口和类之间有什么区别?

热门标签

归档