Я пытаюсь объединить функции двух разных базовых классов в новый класс, но безрезультатно. Скажем, у меня есть класс A и B, тогда как B является потомком A с разной функциональностью (т. Е. Не может использоваться в качестве замены A во время выполнения), и нужен класс C, который объединяет A и B, использует оба и обеспечивает уникальный интерфейс для пользователей C. Как я могу это достичь? Множественное наследование невозможно с C#, интерфейсы, похоже, не подходят. Так что я могу сделать?Объединить функции двух разных базовых классов
ответ
Ваш дизайн не работает.
В является потомком А с различной функциональностью (т.е. не может быть использован в качестве замены для выполнения во время)
Эта ситуация является неправильно использование наследования. Если вы хотите это сделать, вы должны либо использовать композицию, либо общий интерфейс, который вместо этого реализуется как A & B.
+1 для композиции – Luhmann
Хм. Спасибо за цветы. A и B - это классы из библиотеки внешнего типа, а именно SecureBlackbox, особенно классы TElSecureServer и TElDTLSServer. Последний наследует от первого. В то время как первый может использоваться для защиты TCP-соединений, последний используется для UDP.Я должен поддерживать оба в своем приложении, и все будет хорошо, если я смогу запустить собственный класс, потомок TElDTLSServer. Если я наследую только от TElDTLSServer, я больше не могу использовать свой класс для защиты TCP. Он просто не работает и заканчивается явной ошибкой (по некоторым причинам, я не знаю). – neil
Композиция не работает, потому что мне нужно связать внешние объекты с используемыми базовыми классами. Базовый класс способен отражать ссылку на себя в некоторых обратных вызовах (нужно это). Если я использую комбинацию, ссылка указывает на объект чистого базового класса, и я теряю контекст. Поэтому мне нужно наследовать новый класс из базового класса, добавить мои объекты, чтобы получить контекст ... О, какой беспорядок ... – neil
Вы говорите, что B
сходит с A
, но отличается и не может использоваться как A
; это полностью игнорирует цель наследования. Чего вы пытаетесь достичь? Несмотря на это, кажется, что вы должны использовать композицию, а не наследование. Если C
не предоставляет интерфейс, определенный A
или B
, то он не должен наследовать ни от.
Это не я, предоставляя A и B. Внешний тип lib. Я был в надежде, я мог бы использовать B и вернуть его функции A с настройкой, но это не так. B не работает для TCP-соединений (см. Выше). – neil
Рассмотрим явную реализацию интерфейса:
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.5 ... другой 0.5, который вы получите, когда вы удалите ключевое слово 'public' из сигнатур реализации метода явного интерфейса: -> – herzmeister
Тот факт, что вы должны рассмотреть такое действие заставляет меня думать, что вы, возможно, потребуется рассмотреть рефакторинга структуру класса.
Но, чтобы решить вашу непосредственную проблему, почему бы не создать экземпляр двух классов (игнорируйте тот факт, что они находятся в отношениях наследования) и вызовите методы в нужной последовательности? Подумайте о C как фасадную схему для A и B.
. Два класса помогут, но поскольку интерфейс почти идентичен, мне пришлось бы разделить слишком много (другими словами: мне нужно заботиться о том, к какому типу подкладочного объекта, с которым я столкнулся, в то время как я не хочу вообще заботиться) – neil
Для тех из вас, кто требует конкретной информации: я привел некоторую подробную информацию здесь : http://maps.alphadex.de/eldos/explained.txt Указатели приветствуются. – neil
Проблема решена. Теперь используйте System.Reflection.
- 1. Рефакторинг двух базовых классов
- 2. Сравнение объектов двух разных классов?
- 3. C++ «постукивание» в виртуальные функции базовых классов
- 4. Ambigious функции от различных базовых классов C++
- 5. Объединить вывод двух разных кнопок
- 6. Отношения двух объектов разных классов
- 7. Критерии: поиск двух разных классов сущностей
- 8. Массив для хранения объектов двух разных классов?
- 9. Инициализация вариационных базовых классов
- 10. Regex базовых классов
- 11. C# Несколько базовых классов
- 12. Порядок удаления базовых классов
- 13. Перегрузка операторов «базовых» классов
- 14. Назначение абстрактных базовых классов
- 15. Устранение базовых классов
- 16. Как я могу объединить свойства разных классов
- 17. Слияние двух базовых баз данных
- 18. Проксирование или подклассы базовых классов?
- 19. Объединить ненулевые поля в двух классах классов
- 20. Использование базовых классов при наследовании
- 21. Как наследовать один из двух базовых классов, определяя время выполнения
- 22. Doctrine - Создание классов таблиц и базовых классов
- 23. Вопрос реализации базовых классов и производных классов
- 24. Как объединить документы из двух разных коллекций
- 25. Как объединить букву из двух разных строк
- 26. Объединить два столбца двух разных данных DataTable
- 27. Общий объект для двух разных классов
- 28. Как сравнить объекты двух разных классов?
- 29. Рисунок на Jframe из двух разных классов
- 30. Общий базовый класс для двух разных классов?
Ах, и комбинация также невозможна. Это должно быть наследство. – neil
«B является потомком A с разной функциональностью (т. Е. Не может использоваться как замена A во время выполнения)» - это, безусловно, звучит беспорядочно. Зачем ты это делаешь? –
Можете ли вы привести пример того, что будут делать эти классы? И почему интерфейсы и комбинация не будут работать? – Ray