2013-07-11 36 views
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(); 

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

+2

使用反射,当然,或者如果你知道'photo'是一个'Photographer'你可以投它。 –

+2

SaveClients是从摄影师不是IBook的方法,如果你'摄影师照片=新的摄影师'你可以访问'photo.SaveClients()' – wudzik

+1

只是试着去做:) –

回答

11

是的,这是可能的,但你要投你photoPhotographer第一:

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

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

2

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

你可以试试(现在不能测试):

IBook photo; 
photo = new Photographer(); 

(photo as Photographer).SaveClients(); 
// or 
((Photographer)photo).SaveClients(); 
+4

用'as'的方法是一个坏理念。如果'photo'不是'Photographer'这将失败,非描述'NullReferenceException'。 –

+1

......而直接铸造将失败,'InvalidCastException'这是更为清晰,重点突出。这就是你的意思,对吧,@DanielHilgarth? ;) –

+0

@ J.Steen:的确如此。 –

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(); 
} 
相关问题