繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM