我有两个继承自ICart接口的类
当我从这个类创建一个对象时,我只希望Guest类显示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; }
}
答案 0 :(得分:3)
如果IsInfoExists
只能在Guest类中,请将其从界面中删除,并保留在Guest
类中。
实现接口的类必须实现其中的所有方法,但是它可以具有不属于该接口并且特定于该类的其他方法。是否必须在IsInfoExists
类中实现Member
只是为了在之后隐藏它。所以,它会是这样的:
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 :(得分: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.
答案 2 :(得分:1)
使用两个接口来完成此任务。例如,例如ICart
和ICartInfo
。在这种情况下,你有一个明确的分离,它会使你的代码更清晰,更好阅读。
答案 3 :(得分:0)
我猜没有办法。 最近的解决方案是
[Obsolete("Only Guest Member", true)]
public bool IsInfoExist
{
get { return false; }
}
我要用这个。谢谢