考虑这个例子:
public interface IAccount
{
string GetAccountName(string id);
}
public class BasicAccount : IAccount
{
public string GetAccountName(string id)
{
throw new NotImplementedException();
}
}
public class PremiumAccount : IAccount
{
public string GetAccountName(string id)
{
throw new NotImplementedException();
}
public string GetAccountName(string id, string name)
{
throw new NotImplementedException();
}
}
protected void Page_Load(object sender, EventArgs e)
{
IAccount a = new PremiumAccount();
a.GetAccountName("X1234", "John"); //Error
}
如何从客户端调用重写的方法,而无需在抽象/接口上定义新的方法签名(因为它只是高级帐户的特殊情况)?我在这个设计中使用抽象工厂模式......谢谢......
答案 0 :(得分:2)
您必须将接口强制转换为特定类。请记住,这会将整个接口概念抛到窗外,您可以在所有情况下使用特定的类。考虑改为调整您的架构。
答案 1 :(得分:2)
您将引用转换为特定类型:
((PremiumAccount)a).GetAccountName("X1234", "John");
答案 2 :(得分:2)
您可以使用这两种方法定义IPremiumAccount
接口,并将其实现为PremiumAccount类。检查对象是否实现了接口可能比检查特定的基类更好。
public interface IPremiumAccount : IAccount
{
public string GetAccountName(string id, string name);
}
public class PremiumAccount : IPremiumAccount
{
// ...
IAccount a = factory.GetAccount();
IPremiumAccount pa = a as IPremiumAccount;
if (pa != null)
pa.GetAccountName("X1234", "John");
答案 3 :(得分:1)
好吧,考虑到它仅针对PremiumAccount
类型定义,您知道可以调用它的唯一方法是a
实际上是PremiumAccount
,对吧?所以首先投射到PremiumAccount
:
IAccount a = new PremiumAccount();
PremiumAccount pa = a as PremiumAccount;
if (pa != null)
{
pa.GetAccountName("X1234", "John");
}
else
{
// You decide what to do here.
}