[英]Is it possible to access the other members of an interface type?
我很好奇这是否可能,如果没有,那么它背后的原因是什么,以及如何处理这种编程方案?
假设我有这个界面:
public interface IBook
{
void BookClient();
void CancelClient();
}
我有这个实现上述接口的类:
public class Photographer : IBook
{
public void BookClient()
{
// do something
}
public void CancelClient()
{
// do something
}
// non-interface methods
public void SaveClients()
{
// do something
}
public void DeleteClients()
{
// do something
}
}
现在,如果我将此类分配给我的代码中的某个接口类型,例如:
IBook photo;
photo = new Photographer();
是否有可能做到这一点:
// non-interface member from the Photographer class
photo.SaveClients();
有人可以在这个问题上理顺我,也许可以指出我正确的方向。 谢谢。
是的,这是可能的,但您必须先将photo
投入Photographer
:
// non-interface member from the Photographer class
((Photographer)photo).SaveClients();
仅使用photo.SaveClients()
语法是photo.SaveClients()
,因为您可以轻松地创建另一个类:
class TestClass : IBook
{
public void BookClient()
{
// do something
}
public void CancelClient()
{
// do something
}
}
并使用它:
IBook photo;
photo = new Photographer();
photo = new TestClass();
// what should happen here?
photo.SaveClients();
因此,只要将变量用作接口实现,就只能访问该接口中声明的成员。 但是,该对象仍然是一个类实例,因此您可以使用其他类成员,但必须首先显式转换为该类型。
接口类型只能引用接口成员。 您正在尝试调用不属于该接口的类的成员。
你可以试试(现在不能测试):
IBook photo;
photo = new Photographer();
(photo as Photographer).SaveClients();
// or
((Photographer)photo).SaveClients();
是的,有可能,使用反射。 您也可以投射到Photographer
,然后调用SaveClients()
。
在我看来,一个好的解决方案是定义您需要在界面中调用的每组操作,然后,转换为该界面,并调用您需要的方法:
public interface IBook
{
void BookClient();
void CancelClient();
}
public interface IClient
{
void SaveClients();
}
然后用作:
IBook photo = new Photographer();
// now cast photo object as a IClient
IClient client = photo as IClient;
if (client != null)
{
client.SaveClients();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.