Есть ли способ, которым производный класс мог наследовать только некоторые из всех членов базового класса .. в C#? Если такой маневр возможен, предоставьте примерный код.Возможно ли, чтобы класс наследовал только некоторые (не все) базовые классы?
ответ
Когда вы наследуете тип от другого, вы получаете все - как хорошие, так и «плохие» биты от родительского типа («плохо» в этом контексте, что означает то, чего вы не хотели).
Вы можете скрыть что-то от родительского класса в дочернем классе с помощью модификатора new. Однако, возьмите этот совет из многолетнего опыта ... Чаще всего это приводит к большой работе, затрачиваемой на выполнение обходных путей в том, как работает класс детей. Вы избавитесь от неприятностей, если вместо этого вы перепроектируете свои классы.
Если дочерний тип должен отжимать функциональные возможности от родительского типа, у вас, вероятно, есть дефект дизайна у родителя. Измените его, чтобы иметь меньше функциональности. У вас могут быть разные функции, перераспределенные между разными детьми. Вы знаете, что класс не всегда должен быть единственным ребенком;)
Я поддержал только предупреждение о «новом» модификаторе. Из этого ничего, кроме боли. –
Мех, вы можете скрыть унаследованные члены, повторно использующие идентификаторы для реализации частного участника ... но это не очень хорошее решение в конце концов .. –
Имеются действительные применения для «новых». Два примера: (1) эмуляция ковариации возвращаемого типа, (2) указание компилятору, что анализ потенциального хрупкого базового класса был проанализирован и признан фактически правильным. Но да, я согласен с вами в том, что в целом, если вы разрабатываете иерархию типов, в которой вы думаете, что «новое» - это правильная вещь, вероятно, есть более элегантный способ сделать это. Совет в пользу композиции над наследованием хорош в этих случаях. –
Нет, это невозможно. Вы представляете себе Cat
, вызывая Animal
и ребенка (Cat
), определяющего, что интересно от животных или нет? A кошка - животное, и это не может быть изменено.
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
Я пытаюсь понять, как я могу использовать это, чтобы избежать необходимости применять все мои атрибуты снова и снова в приложении ASPMVC при использовании лотов обзорных моделей. – Worthy7
@ Worthy7 Не можете ли вы применить эти атрибуты в абстрактном классе, который реализует некоторые интерфейсы? Таким образом, модели просмотра могут наследовать этот базовый класс, и вы избежите возиться с атрибутами во всех классах. –
Есть ли способ, что производный класс может наследовать лишь немногие из всех базового класса members..in C#?
Да. Создайте базовый класс, который имеет один метод, один конструктор и один деструктор. В нем есть три новых члена, плюс наследуемые члены его базового класса. Теперь выведите класс из этого. Конструктор и деструктор не будут унаследованы; все остальные участники будут. Поэтому можно создать производный класс, который наследует только некоторые из его базовых классов.
Я подозреваю, что ответ неудовлетворен.
Если ваш вопрос на самом деле «есть способ, которым базовый класс может ограничивать, какие наследуемые члены наследуются производным классом?» ответ - нет. Производные классы наследуют всех наследуемых членов базовых классов, независимо от их доступности..
Если у вас есть вопрос, есть ли способ, которым производный класс может выбрать, какие наследуемые члены наследуются от базового класса? " ответ - нет. Производные классы наследуют всех наследуемых членов базовых классов, независимо от их доступности..
Дальнейшее чтение, если эту тему вас интересует:
https://ericlippert.com/2011/09/19/inheritance-and-representation/
Мне нравится ваш ответ, потому что есть садистская часть меня, которая рисует особую часть ада, где идут плохие программисты, и они вынуждены постоянно поддерживать такой код. – Renan
No. Наследование Наследование. Производный класс * является * экземпляром базового класса и, следовательно, содержит все базовые классы. Что вы на самом деле пытаетесь сделать здесь? – David
Класс наследует все базовые элементы.Если вы хотите выбрать, какие члены переопределяемы, вы можете пометить их как «виртуальные» в базовом классе. – Jonesopolis
Я предлагаю вам создать 2 разных класса и пометить тот, который вы не хотите наследовать печать: – Auguste