2017-03-07 74 views
-3

我从ICART接口如何隐藏财产继承接口的类

继承两个类当我创建这个班我想仅来宾类告诉我IsInfoExist属性的对象。我该怎么做?

ICart cart = new Guest(); 
bool c = cart.IsInfoExist //it's ok 

ICart cart = new Member(); 
cart.IsInfoExist not ok. 

其实我不想永远不会出现在intellinsense但接口逼我展示会员IsInfoExist财产

class Guest:ICart 
{ 
    public bool IsInfoExist 
    { 
     get { return Session["guest_info"] != null; } 
    } 

    public void GetCart() 
    { 

    } 
} 

class Member:ICart 
{ 
    //Hide this on intellinsense always! 
    public bool IsInfoExist 
    { 
     get { return false; } 
    } 


    public void GetCart() 
    { 

    } 
} 

public interface ICart 
{ 
    void GetCart(); 
    bool IsInfoExist { get; } 
} 
+9

然后不要使'IsInfoExists'部分的接口 – Pikoh

+2

如果你实现'ICart'接口,那么你有该接口上的成员。通过设计。总是。如果你不想要那些成员,那就不要实现那个接口。这听起来像你想要的是一个不同的界面。 – David

+0

相关:http://stackoverflow.com/questions/56860/what-is-the-liskov-substitution-principle – David

回答

3

如果IsInfoExists只能在Guest类中,请将其从接口中移除并保留Guest类。 实现接口的类必须实现其中的所有方法,但它可以具有其他方法,这些方法不属于接口并且是特定于该类的。废话不得不在Member类中实施IsInfoExists,以后再隐藏它。因此,这将是这样的:

public interface ICart 
{ 
    void GetCart(); 
}  

class Guest:ICart 
{ 
    public bool IsInfoExist 
    { 
     get { return Session["guest_info"] != null; } 
    } 

    public void GetCart() 
    { 
    } 
} 

class Member:ICart 
{ 
    public void GetCart() 
    { 
    } 
} 

编辑

看来这种方法的问题对你来说,你总是使用ICart类型的变量,这样你就无法访问方法。但你可以,你只需要将它转换成正确的类型,如下所示:

ICart cart = new Guest(); 
ICart cart2 = new Member(); 

if (cart is Guest) 
{ 
    bool info=((Guest)cart).IsInfoExist; 
} 

if (cart is Member) 
{ 
    bool info=((Member)cart).IsInfoExist; //this won't compile as IsInfoExist is not in the Member class 
} 
+1

。你不能这样做:)。 – PsyGnosis

+0

确实。编辑:) – Pikoh

2

通过明确执行的财产:

bool ICart.IsInfoExist 
{ 
    get { return Session["guest_info"] != null; } 
} 

如果你有一个Member或一个Guest实例,它将不会有IsInfoExist,除非您明确地将其转换为ICart

Member myMember = new Member(); 
bool test = myMember.IsInfoExist; // won't compile. 
bool test1 = ((ICart) myMember).IsInfoExist; // will compile. 
+1

其实,'bool test = myMember.IsInfoExist'不会编译的唯一原因是因为你将'myMember'声明为'var'。如果你根据OP声明它为'ICart',那么它编译完美。 – MickyD

+0

关于你的编辑,不知道谁会记得一直键入'bool test1 =((ICart)myMember).IsInfoExist'。不太可读。现在,如果最简单的形式_hid_成员默认情况下,复杂的形式提供了访问_hidden_​​成员,那么我会同意。 :)你的意思是 – MickyD

1

使用两个接口来完成。例如,像ICartICartInfo。在这种情况下,你有一个明确的分离,它会让你的代码更清晰,更好的阅读。

0

我想这是没有办法的。 最接近的解决方案是

[Obsolete("Only Guest Member", true)] 
     public bool IsInfoExist 
     { 
      get { return false; } 
     } 

我要去用这个。谢谢