我有一个类,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
?
有人可以详细解释这两个问题吗?
实际上,接口也是一种类型(您不能创建接口实例,因为它们只是元数据)。
由于CustomerNew
工具ICustomer
的一个实例CustomerNew
可以upcasted到ICustomer
。当CustomerNew
键入作为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] 删除。
我来说两句