2013-04-11 2 views
3

Я пытаюсь создать общие методы из своих классов репозитория. Идея - это метод, который что-то делает и возвращает экземпляр класса, который его назвал.Методы расширения - как вернуть правильный тип в наследование?

public class BaseRepository { } 

public class FooRepository : BaseRepository { } 

public class BarRepository : BaseRepository { } 

public static class ExtensionRepository 
{ 
    public static BaseRepository AddParameter(this BaseRepository self, string parameterValue) 
    { 
     //... 
     return self; 
    } 
} 

// Calling the test: 
FooRepository fooRepository = new FooRepository(); 
BaseRepository fooWrongInstance = fooRepository.AddParameter("foo"); 

BarRepository barRepository = new BarRepository(); 
BaseRepository barWrongInstance = barRepository.AddParameter("bar"); 

Ну, таким образом я могу получить экземпляр BaseRepository. Но мне нужно получить экземпляры FooRepository и BarRepository, которые вызвали этот метод. Есть идеи? Огромное спасибо!!!

+0

Вы понимаете, что 'class' тип переменной просто _reference_ к объекту? Какова цель возвращения той же ссылки обратно вызывающему методу? У него уже есть эта ссылка. Может быть веская причина (вот почему я спрашиваю). Дополнение. В приведенном выше примере использования знак '=' просто присваивает ссылку на эту же ссылку на новую переменную. Это не «неправильный пример». Метод не создает новые экземпляры; это тот же самый экземпляр. –

+0

Цель возвращения той же ссылки, Jeppe, состоит в том, чтобы реализовать множество вызовов метода в строке. «Неверный экземпляр» - это способ сказать, что я хочу, чтобы экземпляры детей возвращались, но не базовый класс, вы знаете? – Kiwanax

+0

Теперь я понимаю. Правильный термин «неправильный (нежелательный) тип времени компиляции» или «тип переменной», я думаю. –

ответ

6

Вы можете попробовать использовать дженерики

public static class ExtensionRepository 
{ 
    public static T AddParameter<T>(this T self, string parameterValue) where T:BaseRepository 
    { 
     //... 
     return self; 
    } 
} 
+2

+1, но мы можем улучшить это, используя 'where T: BaseRepository' –

+0

@ Moo-Juice, спасибо, я обновил ответ. – alex

+0

Спасибо, Алекс. Я уже думал об этом решении, но хочу создать элегантный код. Что-то вроде: "fooRepository.AddParameter (" value ")" вместо "fooRepository.AddParameter (" value ")", вы знаете? – Kiwanax

0

Почему вы хотите, чтобы вернуть self в первую очередь? Насколько я могу судить (не знаю, что внутри вашего тела метода), вы не назначаете новый объект self. Таким образом, это тот же экземпляр, который вы возвращаете, поскольку у вызывающего уже есть.

Может быть, вы могли бы сделать его вернуть void:

public static void AddParameter(this BaseRepository self, string parameterValue) 
{ 
    //... 
} 

Использование:

FooRepository fooRepository = new FooRepository(); 
fooRepository.AddParameter("foo"); 
// fooRepository is still fooRepository after the call 


BarRepository barRepository = new BarRepository(); 
barRepository.AddParameter("bar"); 
// barRepository is still barRepository after the call 
+1

. Цель возврата одного и того же экземпляра - вызвать много методов в строке, вы знаете? Например: "fooRepository.AddParameter (" "). AddSomeStuff (" "," ") .AddAnotherStuff (" "). List();". Что-то вроде этого. – Kiwanax

+0

@ Kiwanax Хорошо, тогда вы могли бы использовать решение из другого ответа. –

+0

Да, @ Джеппе, другое решение решило мою проблему. Спасибо за ответ! – Kiwanax

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