2010-10-30 4 views
0

Рассмотрим следующий пример:Перегрузки абстрактный метод

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 
} 

Как я могу вызвать перекрытый метод от клиента без необходимости определить новый метод подписи на абстрактном/интерфейс (так как это только специальный случае для премиум-счета)? Я использую абстрактный шаблон фабрики в этом дизайне ... спасибо ...

ответ

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. 
} 
2

Вам нужно будет отнести интерфейс к определенному классу. Имейте в виду, что это исключило бы всю концепцию интерфейсов прямо из окна, и вы могли бы использовать определенные классы во всех случаях. Подумайте о настройке своей архитектуры.

+0

да, как я уже сказал, это только для особых случаев, так как абстрактный узор не имеет конкретного решения для особых случаев, как это ... – CSharpNoob

2

Вы бросили ссылку на конкретный тип:

((PremiumAccount)a).GetAccountName("X1234", "John"); 
+0

'IAccount а = новый PremiumAccount()', поэтому нет никакой необходимости cast –

+0

@SaeedAlg: Вы ошибаетесь. Ссылка имеет тип 'IAccount', поэтому он не знает о методах, которые существуют только в' PremiumAccount'. – Guffa

+0

Извините, имена методов были такими же: D –

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"); 
Смежные вопросы