2013-11-21 3 views
2

У меня есть проблема, когда у меня есть две реализации, которые я хочу разделить с интерфейсом, но они будут иметь разные типы для «того же параметра», см. Один Guid и один Int.Интерфейс с различными типами

Например:

public Class1 : IGetObject { 
    GetObjectBy(int Id); 
} 

public Class2 : IGetObject { 
    GetObjectBy(Guid Id); 
} 

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

public GetObjectMethod(){ 
    string id = dropdown.SelectedItem.Text; 
    IGetObject GetObject = Shared.Instance.GetObject; 
    var result = GetObject.GetObjectBy(id); 
} 

Как я могу сделать свою долю РЕАЛИЗАЦИИ интерфейса, так что я не должен что-то изменить в GetObjectMethod?

Возможно, идея состоит в том, чтобы создать новый тип и объявить об этом в общем интерфейсе. Таким образом, реализация знает, какой из них следует использовать:

public class ObjectId(){ 
    public ObjectId(string id){ 
     if(Guid.TryParse(id)){ 
     /// Figure out what value that should be set 
     } 
    } 

    public Guid ObjectIdAsGuid; 
    public Int ObjectIdAsInt; 
} 

Каков наилучший способ сделать это?

+0

Какое у вас определение интерфейса? Я предполагаю, что он должен иметь 2 перегрузки 'GetObjectBy' –

+0

, тогда оба должны быть реализованы. –

+0

Проблема в том, что я не знаю, как объявить интерфейс. Даже если у меня была перегрузка, GetObjecetMethod должен определить, какой тип он находится в аргументе «id». –

ответ

4

Вы можете создать метод GetObjectBy, который принимает строку (или объект), а затем разобрать (или литой) идентификатор в реализации интерфейса:

public Class1 : IGetObject { 
    public Foo GetObjectBy(string Id) 
    { 
     var id = Int32.Parse(Id); 
     //... 
    } 
} 

public Class2 : IGetObject { 
    public Foo GetObjectBy(string Id) 
    { 
     var id = new Guid(Id); 
     //... 
    } 
} 
2

Я хочу поделиться интерфейсом, но они будут иметь разные типы для «того же параметра»

Один из способов сделать это, чтобы сделать интерфейс родовой:

public interface IGetObject<T> 
{ 
    void GetObjectBy(T Id); 
} 

public class Class1 : IGetObject<int> { 
    void GetObjectBy(int Id); 
} 

public class Class2 : IGetObject<Guid> { 
    void GetObjectBy(Guid Id); 
} 

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

public interface IGetObject 
{ 
    void GetObjectBy(int Id); 
    void GetObjectBy(Guid Id); 
} 

public class Class1 : IGetObject { 
    void GetObjectBy(int Id); 
    void GetObjectBy(Guid Id); 
} 

public class Class2 : IGetObject<Guid> { 
    void GetObjectBy(int Id); 
    void GetObjectBy(Guid Id); 
} 
+0

С этим соглашением мне нужно реализовать функцию «тип угадывания» в методе GetObjectMethod, и если я хочу продлить ее позже, мне нужно изменить метод impemention. –

+0

Возможно, вы должны включить пример, используя ['Convert.ChangeType'] (http://msdn.microsoft.com/en-us/library/dtb69x08 (v = vs.110) .aspx), чтобы он работал с' string 'ввод, как ему нужно. Я думаю, это было бы моим предпочтительным решением. –

+0

@TimS. Как вы это понимаете под Convert.ChangeType? –

0

Создать базовый класс для ID, которые сочетают оба типа идентификатора еще одному общий ID

+0

Не могли бы вы показать пример кода, как вы это понимаете? –

+0

@ SimonEdström: Я думаю, что это в основном ваше последнее предложение, класс ObjectID, который, я думаю, является хорошей идеей. У вас есть концепция идентификатора, и его следует рассматривать как класс, который при необходимости может быть преобразован в ints, Guids или что-то еще. – RalphChapin

Смежные вопросы