2016-05-10 5 views
2

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

+0

No. Наследование Наследование. Производный класс * является * экземпляром базового класса и, следовательно, содержит все базовые классы. Что вы на самом деле пытаетесь сделать здесь? – David

+0

Класс наследует все базовые элементы.Если вы хотите выбрать, какие члены переопределяемы, вы можете пометить их как «виртуальные» в базовом классе. – Jonesopolis

+0

Я предлагаю вам создать 2 разных класса и пометить тот, который вы не хотите наследовать печать: – Auguste

ответ

1

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

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

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

+1

Я поддержал только предупреждение о «новом» модификаторе. Из этого ничего, кроме боли. –

+0

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

+1

Имеются действительные применения для «новых». Два примера: (1) эмуляция ковариации возвращаемого типа, (2) указание компилятору, что анализ потенциального хрупкого базового класса был проанализирован и признан фактически правильным. Но да, я согласен с вами в том, что в целом, если вы разрабатываете иерархию типов, в которой вы думаете, что «новое» - это правильная вещь, вероятно, есть более элегантный способ сделать это. Совет в пользу композиции над наследованием хорош в этих случаях. –

0

Нет, это невозможно. Вы представляете себе 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 
+0

Я пытаюсь понять, как я могу использовать это, чтобы избежать необходимости применять все мои атрибуты снова и снова в приложении ASPMVC при использовании лотов обзорных моделей. – Worthy7

+0

@ Worthy7 Не можете ли вы применить эти атрибуты в абстрактном классе, который реализует некоторые интерфейсы? Таким образом, модели просмотра могут наследовать этот базовый класс, и вы избежите возиться с атрибутами во всех классах. –

10

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

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

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

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

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

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

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

+0

Мне нравится ваш ответ, потому что есть садистская часть меня, которая рисует особую часть ада, где идут плохие программисты, и они вынуждены постоянно поддерживать такой код. – Renan