Как использовать Private Inheritance aka C++ в C# и почему его нет в C#
Я знаю, что частное наследование поддерживается в C++, а в C# поддерживается только публичное наследование. Я также натолкнулся на статью, в которой говорится, что частное наследование обычно определяет отношения HAS-A и тип отношений агрегации между классами.
РЕДАКТИРОВАТЬ: C++ код для частного наследования: отношение "Car has-a Engine" также может быть выражено с использованием частного наследования:
class Engine {
public:
Engine(int numCylinders);
void start(); // Starts this Engine
};
class Car : private Engine { // Car has-a Engine
public:
Car() : Engine(8) { } // Initializes this Car with 8 cylinders
using Engine::start; // Start this Car by starting its Engine
};
Теперь, есть ли способ создать отношения HAS-A между классами C#, что мне хотелось бы знать - КАК?
Другой любопытный вопрос: почему C# не поддерживает частное (и также защищенное) наследование? - Разве поддержка множественного внедрения наследования не является уважительной причиной или какой-либо другой?
Планируется ли частное (и защищенное) наследование для будущих версий C#?
Будет ли поддержка частного (и защищенного) наследования в C# сделать его лучшим и широко используемым языком?
2 ответа
Теперь, есть ли способ создать отношения HAS-A между классами C#, что мне хотелось бы знать - КАК?
Сделайте, чтобы один класс имел поле другого класса:
class Car
{
Engine engine;
}
У машины есть двигатель.
Другой любопытный вопрос: почему C# не поддерживает частное (и также защищенное) наследование?
У вас есть ящик в подвале. Вы никогда ни разу ничего не вкладывали в это. Кто-то спрашивает вас "почему эта коробка пуста?" Какой ответ вы можете дать, кроме того, что коробка пуста, потому что никто никогда не кладет в нее ничего?
C# не поддерживает частное или защищенное наследование, потому что никто никогда не реализовывал эту функцию и не отправлял ее клиентам. По умолчанию функции не реализованы бесплатно. Это не значит, что мы запустили C# с закрытым и защищенным наследованием, а затем удалили их по какой-то веской причине. Эти функции никогда не были в первую очередь, и неудивительно, что они все еще не там. Особенности не растут сами по себе.
Разве поддержка множественного внедрения наследования не является уважительной причиной или какой-либо другой?
Я не понимаю вопроса.
Планируется ли частное (и защищенное) наследование для будущих версий C#?
Нет.
Будет ли поддержка частного (и защищенного) наследования в C# сделать его лучшим языком, чем сейчас?
Я так не думаю.
Одна из многих проблем с наследованием, которое мы обычно видим в ООП, заключается в том, что оно полностью объединяет семантическое отношение "является своего рода" с отношением механизма "повторное использование деталей реализации". Частное наследование частично решает эту проблему.
Есть небольшое количество ситуаций, в которых мне бы очень хотелось иметь частное наследование в C#; недавним примером было то, что у меня была структура данных, которую можно было построить в целом, но которую я не хотел показывать пользователям:
internal class FancyDataStructure<T> {...}
но можно сериализовать только тогда, когда T был int (по причинам, не имеющим отношения к обсуждению). Я хотел бы сказать:
public class SerializableThingy : private FancyDataStructure<int>
Вместо этого я просто сделал FancyDataStructure<T>
вложенный тип SerializableThingy
и использовал композицию, а не наследство. Для написания небольшого количества "сантехнического" кода все получилось просто отлично.
Я не думаю, что добавление функции окупается; это добавляет сложности к языку в обмен на очень маленькую выгоду от избежания некоторых тривиальных налогов на сантехнику.
Будет ли поддержка частного (и защищенного) наследования в C# сделать его более широко используемым языком, чем сейчас?
Как я или кто-либо еще в этом отношении мог узнать ответ на этот вопрос? Stackru - это плохое место для того, чтобы задавать вопросы, которые требуют предсказания будущего на основе контрафакта. Мои предложения:
- Реализуйте версию C# с нужной вам функцией. Посмотрите, станет ли это популярным. Тогда ты узнаешь.
- Найдите человека с психическими способностями, который может предсказать, каким будет будущее , если сейчас все будет иначе. Поскольку предсказания, основанные на контрфактуальности, автоматически выполняются по правилам дедуктивной логики, прогнозы будут точными.
Вы должны создать отношение Has-a обычным способом: один класс содержит член экземпляра другого класса.
В C++ частное наследование иногда используется для представления реализованных в терминах отношений, обычно для простоты получения доступа к родительским методам / интерфейсу. Это, вероятно, достаточно редкое использование, и я не буду слишком обеспокоен тем, что C# не предлагает его, особенно когда композиция предлагает довольно схожую функциональность.