2016-09-14 4 views
1

У меня есть 3 функции, и они являются ветвями того же типа.Как создать общий метод перегрузки в C#?

public interface k 
{ 
    void CreateOrUpdate(IList<TagInfoForRecommender> tagList, IndexType indexType); 
    void CreateOrUpdate(IList<ArtifactInfoForRecommender> artifactList, IndexType indexType); 
    void CreateOrUpdate(IList<UserInfoForRecommender> userList, IndexType indexType); 
} 

Я хотел бы создать один общий тип, где реализован класс, который наследует интерфейс может писать перегружает методу функции.

Я попытался

public interface k 
{  
    void CreateOrUpdate<T>(IList<T> tagList, IndexType indexType) 
     where T : BaseInfoForRecommender; 
} 

Но он может создать только один метод в классе реализован.

Я хочу создать перегрузки в

public class d : K 
{ 
    CreateOrUpdate<TagInfoForRecommender>(IList<TagInfoForRecommender> tagList, IndexType indexType) 
    { 
     //impelement sth 
    } 

    CreateOrUpdate<TagInfoForRecommender>(IList<TagInfoForRecommender> tagList, IndexType indexType) 
    { 
     //impelement sth 
    } 
} 
+1

Это не ясно, где перегруженные придет в. Вы не могли бы дать * полный * (но минимальный) пример того, что вы хотели бы сделать? –

+0

Пожалуйста, напишите код (вариант, который вы хотите, даже если он не компилируется). –

+0

Я отредактировал сообщение. Я хочу перегрузки в реализованном интерфейсе. –

ответ

4

Вы можете использовать общий интерфейс

public interface K<T> where T : BaseInfoForRecommender{ 
    void CreateOrUpdate(IList<T> list, IndexType indexType); 
} 

, а затем реализовать интерфейс несколько раз для каждого типа

public class d : K<TagInfoForRecommender>, 
       K<ArtifactInfoForRecommender>, 
       K<UserInfoForRecommender> { 
    public void CreateOrUpdate(IList<TagInfoForRecommender> list, IndexType indexType) {...} 
    public void CreateOrUpdate(IList<ArtifactInfoForRecommender> list, IndexType indexType) {...} 
    public void CreateOrUpdate(IList<UserInfoForRecommender> list, IndexType indexType) {...} 
} 
+0

Моя единственная забота о вашем ответе (что я нашел довольно хорошо), это когда у вас есть только тип возврата, который меняет подпись. Вам нужно будет (явно реализовать свои методы и) использовать свой экземпляр на определенном интерфейсе, иначе вы не сможете получить доступ к своим методам. Даже если это позволяет избежать исключений и проверки типов, как мой ответ. Это может раздражать, чтобы всегда приводить ваш экземпляр для доступа к каждому методу. Поправьте меня если я ошибаюсь. –

+0

@ romain-aga Нет, вы правы. Иногда это может быть громоздким, но это зависит от остальной части приложения и того, как он использует код. Но в этом случае подпись метода всегда различна, и вам не нужно явно ее реализовывать. – Jehof

+0

Вы всегда можете добавить общий CreateOrUpdate, что бы назвать конкретную CreateOrUpdate 'общественного недействительными CreateOrUpdate (IList список, IndexType indexType) где T: BaseInfoForRecommender { ((K ) это) .CreateOrUpdate (список, indexType); } 'Вы рискуете вызвать ошибку во время выполнения, если вы вызываете этот метод с типом, который не реализован. – Grax

1

Вы не можете сделать это.

Единственное, что может подобраться того, что вы пытаетесь достичь (если я понимаю вашу проблему хорошо), делая некоторые проверки типов:

public interface IAbstraction 
{ 
    void CreateOrUpdate<T>(IList<T> tagList, IndexType indexType) 
     where T : BaseInfoForRecommender; 
} 

Реализация:

public class Concrete : IAbstraction 
{ 
    void CreateOrUpdate<T>(IList<T> tagList, IndexType indexType) 
     where T : BaseInfoForRecommender 
    { 
     var dict = new Dictionary<Type, Action<IList<object>, IndexType>() 
     { 
      { typeof(TagInfoForRecommender), 
       (tagList, indexType) => CreateOrUpdateTagInfoForRecommender(list.Cast<TagInfoForRecommender>(), index) }, 

      { typeof(ArtifactInfoForRecommender), 
       (tagList, indexType) => CreateOrUpdateArtifactInfoForRecommender(list.Cast<ArtifactInfoForRecommender>(), index) }, 

      { typeof(UserInfoForRecommender), 
       (tagList, indexType) => CreateOrUpdateUserInfoForRecommender(list.Cast<UserInfoForRecommender>(), index) }, 
     }; 
     dict[typeof(T)](tagList.Cast<object>(), indexType); 
    } 

    private CreateOrUpdateTagInfoForRecommender(IList<TagInfoForRecommender> tagList, IndexType indexType) 
    { 
    } 

    private CreateOrUpdateArtifactInfoForRecommender(IList<ArtifactInfoForRecommender> tagList, IndexType indexType) 
    { 
    } 

    private CreateOrUpdateUserInfoForRecommender(IList<UserInfoForRecommender> tagList, IndexType indexType) 
    { 
    } 
} 

I угадайте, вы можете написать что-то лучше, так как я не пробовал свой код (у вас должны быть некоторые ошибки). Но у вас есть основная идея.