2

我很好奇这是否可能,如果没有,背后的原因是什么,如果有的话,人们将如何处理这种编程场景?

假设我有这个界面:

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

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

4

3 回答 3

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

所以只要将变量用作接口实现,就只能访问该接口中声明的成员。但是,该对象仍然是一个类实例,因此您可以使用其他类成员,但您必须先显式转换为该类型。

于 2013-07-11T07:06:42.613 回答
2

接口类型只能引用接口成员。您正在尝试调用不属于接口的类的成员。

您可以尝试(现在无法测试):

IBook photo;
photo = new Photographer();

(photo as Photographer).SaveClients();
// or
((Photographer)photo).SaveClients();
于 2013-07-11T07:07:40.660 回答
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();
}
于 2013-07-11T07:11:32.497 回答