Как использовать 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# не предлагает его, особенно когда композиция предлагает довольно схожую функциональность.

Другие вопросы по тегам