2015-03-11 2 views
0

У меня есть четыре класса и интерфейс, что-то вроде этого:Сопряжение с абстрактным классом Different производного класса

public interface ISource 
{ 
    DesiredFunc(); 
} 

public class Source 
{ 

} 

public class SourceA : Source 
{ 

} 

public class SourceAChild : SourceA, ISource 
{ 
    DesiredFunc() 
    { 
    } 
} 

public abstract class SourceB : Source, ISource 
{ 
    DesiredFunc() 
    { 
    } 
} 

Source и SourceA приходят из библиотеки, так что нет никакого способа, я могу изменить их реализацию. Существует объект SourceAChild, который вызывает DesiredFunc(), но ему необходимо использовать реализацию DesiredFunc() в SourceB.

Что я сделал до сих пор, это создать класс обертки SourceB. Я создаю экземпляр этого класса внутри SourceAChild, а затем вызываю базовый метод. Что-то вроде

public class SourceBChild : SourceB, ISource 
{ 
    DesiredFunc() 
    { 
      base.DesiredFunc(); 
    } 
} 

public class SourceAChild : SourceA, ISource 
{ 
    SourceBChild srcB = new SourceBChild(); 

    DesiredFunc() 
    { 
     srcB.DesiredFunc(); 
    } 
} 

Это кажется довольно уродливым для меня. Есть ли лучший способ добраться до SourceB's внедрения DesiredFunc()? Одна из самых больших проблем, с которыми я сталкиваюсь в обходной ситуации, которую я сейчас вижу, - это целостность данных между SourceAChild и SourceBChild, потому что прежний класс часто обновляет свои свойства.

Заранее благодарим за любую помощь.

+0

Возможно, вы можете изучить образец декоратора? –

+0

Создано ли 'SourceB' то, что вы создали, или это из той же библиотеки, что и' SourceA'? – SwDevMan81

+0

Ну * I * не создавал 'SourceB'. Это то, что можно изменить, хотя мне было рекомендовано не по возможности. – Josh

ответ

0

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

Если DesiredFunc из SourceB является public, ваш класс-оболочка может быть упрощена:

public class SourceBChild : SourceB 
{ 
} 

DesiredFunc метод будет автоматически подвергаться. Однако, если это protected, вам нужно обернуть его, как вы уже делали.

Последняя строка ваших комментариев не имеет большого смысла для меня - вы упоминаете целостность и свойства данных, но так как DesiredFunc из SourceB пробегов на экземпляре SourceBChild, он не может использовать поля или свойства вашей SourceA пример.

+0

'DesiredFunc' защищен, поэтому я думаю, что застрял. То, что я подразумеваю под целостностью данных, заключается в том, что этот «DesiredFunc» работает на свойстве, глубоко погруженном в родительский класс «Source», который отображает некоторую информацию пользователю. Я беспокоюсь, что когда функция «SourceB» вызывает эту функцию, то, что показано пользователю, может не совпадать с тем, что хранится в 'SourceAChild', как должно. – Josh

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