我很好奇这是否可能,如果没有,那么它背后的原因是什么,以及如何处理这种编程场景?
假设我有这个界面:
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();
有人可以在这个问题上理顺我,也许可以指出我正确的方向。感谢。
答案 0 :(得分:11)
是的,这是可能的,但您必须先将photo
投入Photographer
:
// non-interface member from the Photographer class
((Photographer)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();
因此,只要您将变量用作接口实现,就只能访问该接口中声明的成员。但是,该对象仍然是一个类实例,因此您可以使用其他类成员,但您必须首先显式转换为该类型。
答案 1 :(得分:2)
接口类型只能引用接口成员。您正在尝试调用不属于该接口的类的成员。
你可以试试(现在不能测试):
IBook photo;
photo = new Photographer();
(photo as Photographer).SaveClients();
// or
((Photographer)photo).SaveClients();
答案 2 :(得分:1)
是的,可以使用反射。您也可以转为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();
}