是否可以访问接口类型的其他成员?

时间:2013-07-11 07:05:26

标签: c#

我很好奇这是否可能,如果没有,那么它背后的原因是什么,以及如何处理这种编程场景?

假设我有这个界面:

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();

有人可以在这个问题上理顺我,也许可以指出我正确的方向。感谢。

3 个答案:

答案 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();
}