2010-02-14 2 views
2

Я пытаюсь объединить функции двух разных базовых классов в новый класс, но безрезультатно. Скажем, у меня есть класс A и B, тогда как B является потомком A с разной функциональностью (т. Е. Не может использоваться в качестве замены A во время выполнения), и нужен класс C, который объединяет A и B, использует оба и обеспечивает уникальный интерфейс для пользователей C. Как я могу это достичь? Множественное наследование невозможно с C#, интерфейсы, похоже, не подходят. Так что я могу сделать?Объединить функции двух разных базовых классов

+0

Ах, и комбинация также невозможна. Это должно быть наследство. – neil

+0

«B является потомком A с разной функциональностью (т. Е. Не может использоваться как замена A во время выполнения)» - это, безусловно, звучит беспорядочно. Зачем ты это делаешь? –

+0

Можете ли вы привести пример того, что будут делать эти классы? И почему интерфейсы и комбинация не будут работать? – Ray

ответ

14

Ваш дизайн не работает.

В является потомком А с различной функциональностью (т.е. не может быть использован в качестве замены для выполнения во время)

Эта ситуация является неправильно использование наследования. Если вы хотите это сделать, вы должны либо использовать композицию, либо общий интерфейс, который вместо этого реализуется как A & B.

+2

+1 для композиции – Luhmann

+0

Хм. Спасибо за цветы. A и B - это классы из библиотеки внешнего типа, а именно SecureBlackbox, особенно классы TElSecureServer и TElDTLSServer. Последний наследует от первого. В то время как первый может использоваться для защиты TCP-соединений, последний используется для UDP.Я должен поддерживать оба в своем приложении, и все будет хорошо, если я смогу запустить собственный класс, потомок TElDTLSServer. Если я наследую только от TElDTLSServer, я больше не могу использовать свой класс для защиты TCP. Он просто не работает и заканчивается явной ошибкой (по некоторым причинам, я не знаю). – neil

+0

Композиция не работает, потому что мне нужно связать внешние объекты с используемыми базовыми классами. Базовый класс способен отражать ссылку на себя в некоторых обратных вызовах (нужно это). Если я использую комбинацию, ссылка указывает на объект чистого базового класса, и я теряю контекст. Поэтому мне нужно наследовать новый класс из базового класса, добавить мои объекты, чтобы получить контекст ... О, какой беспорядок ... – neil

0

Вы говорите, что B сходит с A, но отличается и не может использоваться как A; это полностью игнорирует цель наследования. Чего вы пытаетесь достичь? Несмотря на это, кажется, что вы должны использовать композицию, а не наследование. Если C не предоставляет интерфейс, определенный A или B, то он не должен наследовать ни от.

+0

Это не я, предоставляя A и B. Внешний тип lib. Я был в надежде, я мог бы использовать B и вернуть его функции A с настройкой, но это не так. B не работает для TCP-соединений (см. Выше). – neil

1

Рассмотрим явную реализацию интерфейса:

http://msdn.microsoft.com/en-us/library/ms173157.aspx

public interface IFriendly 
{ 
    void Greet(); 
} 

public interface IEnemy 
{ 
    void Greet(); 
} 

public class SomeGuy : IFriendly, IEnemy 
{ 
    //default Greeting 
    public void Greet() 
    { 
    //... 
    } 

    //greeting when using an IFriendly reference 
    void IFriendly.Greet() 
    { 
    //,, 
    } 

    //greeting when using an IEnemy reference 
    void IEnemy.Greet() 
    { 
    //,, 
    } 
} 
+0

+0.5 ... другой 0.5, который вы получите, когда вы удалите ключевое слово 'public' из сигнатур реализации метода явного интерфейса: -> – herzmeister

0

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

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

+0

. Два класса помогут, но поскольку интерфейс почти идентичен, мне пришлось бы разделить слишком много (другими словами: мне нужно заботиться о том, к какому типу подкладочного объекта, с которым я столкнулся, в то время как я не хочу вообще заботиться) – neil

+0

Для тех из вас, кто требует конкретной информации: я привел некоторую подробную информацию здесь : http://maps.alphadex.de/eldos/explained.txt Указатели приветствуются. – neil

0

Проблема решена. Теперь используйте System.Reflection.

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