重载抽象方法

时间:2010-10-30 16:40:05

标签: c# overloading abstraction

考虑这个例子:

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
}

如何从客户端调用重写的方法,而无需在抽象/接口上定义新的方法签名(因为它只是高级帐户的特殊情况)?我在这个设计中使用抽象工厂模式......谢谢......

4 个答案:

答案 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.
}