Запретить унаследованному члену доступ к защищенному члену - PullRequest
0 голосов
/ 15 октября 2018

Есть ли в C # способ предотвратить наследование защищенного свойства производным классом?

class Base
{
   protected int A { get; set; }
}

class DerivedA : Base
{
}

class DerivedB : DerivedA
{
}

Я хочу, чтобы DerivedA имел доступ к свойству A, однако DerivedB не должен.Так есть ли способ ограничить наследование свойства в середине иерархии наследования?

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

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

    class Base
    {            
    }

    class BaseA : Base
    {
        protected int A { get; set; }
    }

    class Derived : Base
    {
    }

    class DerivedA : BaseA
    {
    }
0 голосов
/ 15 октября 2018

Что ж, в комментариях есть некоторая ценная информация, поэтому я подумал, что мне лучше повторить ее, чтобы она не потерялась.

Кевин Госс предложил использовать private protected модификатор доступа.

Комбинация ключевых слов private protected является модификатором доступа члена.Закрытый защищенный член доступен по типам, производным от содержащего класса, но только внутри его содержащей сборки.

Обратите внимание, что этот модификатор доступа доступен только в версии c # 7.2 или выше.

Хотя я согласен с Кевином, это может быть прямым ответом на ваш вопрос, HimBromBeere предположил, что этот вопрос на самом деле является XYProblem - это означает, что вы спрашиваете, как реализовать решение, с которым у вас возникли проблемы, вместо того, чтобы спрашивать, как решить основную проблему.
Я такжес ним тоже согласен.

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

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

0 голосов
/ 15 октября 2018

Вы должны сделать его запечатанным:

class Base
{
   protected int A { get; set; }
}

class DerivedA : Base
{
   protected sealed override int A { get => base.A; set => base.A = value; }
}

class DerivedB : DerivedA
{
   // Attempting to override A causes compiler error.
}

Подробнее читайте здесь: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/sealed

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...