Возможно ли, чтобы класс наследовал только некоторые (не все) базовые классы?

Есть ли способ, которым производный класс мог наследовать только некоторые из всех членов базового класса. В С#? Если такой маневр возможен, просьба указать примерный код.

3
10 мая '16 в 20:28
источник поделиться
3 ответов

Есть ли способ, которым производный класс мог наследовать только несколько из всех членов базового класса. В С#?

Да. Создайте базовый класс, который имеет один метод, один конструктор и один деструктор. В нем есть три новых члена, плюс наследуемые члены его базового класса. Теперь выведите класс из этого. Конструктор и деструктор не будут унаследованы; все остальные участники будут. Поэтому можно создать производный класс, который наследует только некоторые из его базовых классов.

Я подозреваю, что ответ неудовлетворен.

Если ваш вопрос на самом деле "есть способ, которым базовый класс может ограничивать, какие наследуемые члены наследуются производным классом?" ответ - нет. Производные классы наследуют все наследуемые члены базовых классов, независимо от их доступности.

Если ваш вопрос: "существует ли способ, которым производный класс может выбрать, какие наследуемые члены наследуются от базового класса?" ответ - нет. Производные классы наследуют все наследуемые члены базовых классов, независимо от их доступности.

Дальнейшее чтение, если эта тема вас интересует:

https://ericlippert.com/2011/09/19/inheritance-and-representation/

10
10 мая '16 в 20:44
источник

Когда вы наследуете тип от другого, вы получаете все - и хорошие, и "плохие" биты из родительского типа ( "плохо", в этом контексте, что означает то, что вы не хотели иметь).

Вы можете скрыть что-то от родительского класса в дочернем классе с помощью модификатора new. Однако, возьмите этот совет из многолетнего опыта... Чаще всего это приводит к большой работе, затрачиваемой на выполнение обходных путей в том, как работает класс детей. Вы избавитесь от больших проблем, если вместо этого вы перепроектируете свои классы.

Если дочерний тип должен отключать функциональные возможности от родительского типа, у вас, вероятно, есть дефект дизайна у родителя. Измените его, чтобы иметь меньше функциональности. У вас могут быть разные функции, перераспределенные между разными детьми. Вы знаете, класс не всегда должен быть единственным ребенком;)

1
10 мая '16 в 20:38
источник

Нет, это невозможно. Представляете ли вы Cat вывод Animal, а ребенок (Cat) решает, что интересно от животных или нет? Кошка - животное, и это нельзя изменить.

BTW, интерфейсы могут использоваться для скрытия деталей. Например:

public interface ISome
{
    string Text { get; set; }
}

public class A : ISome
{
    public string Text { get; set; }
    public string Text2 { get; set; }
}

public class B : A
{
}

// This is an upcast. You're reducing the typing of an instance of B
ISome a = new B();
string text2 = a.Text2; // Error, Text2 isn't a property of ISome
string text = a.Text; // OK, Text is a property of ISome
0
10 мая '16 в 20:41
источник

Посмотрите другие вопросы по меткам или Задайте вопрос