Как использовать Private Inheritance aka C ++ в C # и почему его нет в C # - PullRequest
4 голосов
/ 17 ноября 2011

Я знаю, что частное наследование поддерживается в C ++, и в C # поддерживается только публичное наследование. Я также натолкнулся на статью, в которой говорится, что частное наследование обычно определяет отношения HAS-A и тип отношений агрегации между классами.

РЕДАКТИРОВАТЬ: C ++ код для частного наследования: Отношение "Автомобиль имеет двигатель" также можно выразить с помощью частного наследования:

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 ]

14 голосов
/ 17 ноября 2011

Теперь, есть ли способ создать отношения 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> a вложенного типа из SerializableThingyи использовал композицию, а не наследство.Для написания небольшого количества «слесарного» кода все получилось хорошо.

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

Будет ли поддержка частного (и защищенного) наследования в C # сделать его более широко используемым языком, чем онсейчас?

Как мог я или кто-либо еще в этом отношении, возможно, узнать ответ на этот вопрос?StackOverflow - это плохое место для того, чтобы задавать вопросы, которые требуют предсказания будущего на основе контрафакта.Мои предложения:

  • Реализация версии C # с нужной вам функцией.Посмотрите, станет ли это популярным.Тогда вы узнаете.
  • Найдите человека с экстрасенсорными способностями, который может предсказать, каким будет будущее , если бы сейчас все было иначе.Поскольку предсказания, основанные на контрфактуальности, согласно правилам дедуктивной логики автоматически верны , предсказания будут точными.
1 голос
/ 17 ноября 2011

Вы бы создали отношение Has-a обычным способом: один класс содержал бы экземпляр экземпляра другого класса.

В C ++ частное наследование иногда используется для представления реализованных в терминах отношений, как правило, для простоты получения доступа к родительским методам / интерфейсу. Вероятно, это достаточно редкое использование, и я не буду слишком обеспокоен тем, что C # не предлагает его, особенно когда композиция предлагает довольно схожую функциональность.

...