Попытка получить доступ к защищенному члену в производном классе, используя объект базового класса - PullRequest
0 голосов
/ 12 февраля 2020

В этой строке выдается ошибка: невозможно получить доступ к защищенному члену BaseClass.number через квалификатор типа BaseClass, квалификатор должен иметь тип DerivedClass (или его производный), может кто-то мне помочь с этим. см. код ниже, спасибо в adavance

using System;
public class BaseClass
{
    protected int number = 10;
}
public class DerivedClass: BaseClass
{   
    public void Print()
    {
        BaseClass obj = new BaseClass();
        //Console.WriteLine(obj.number); 
    // we get error if we try to print why?
    }
}
class Program
{
    public static void Main()
    {
        DerivedClass obj2 = new DerivedClass();
        obj2.Print();
    }
}

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

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Ваш вопрос, кажется, отражает этот пример в документах.

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

public class DerivedClass : BaseClass
{   
    public void Print()
    {
        BaseClass baseClass = new BaseClass();
        DerivedClass derived = new DerivedClass();

        // This is ok
        Console.WriteLine(number); 

        // So is this
        Console.WriteLine(derived.number);

        // But you can't do this
        Console.WriteLine(baseClass.number); 
    }
}

Без этого ограничения было бы возможно следующее, что явно является недостатком безопасности:

public class AnotherDerivedClass : BaseClass
{
    public bool IsValid => number == 10;
}

public class DerivedClass : BaseClass
{   
    public void Print()
    {
        BaseClass anotherAsBase = new AnotherDerivedClass();

        anotherAsBase.number = 0;
    }
}

В приведенном выше примере экземпляр DerivedClass вмешался в детали реализации AnotherDerivedClass. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. * * * * * * * Это не может быть AnotherDerivedClass.

0 голосов
/ 12 февраля 2020
using System;
public class BaseClass
{
    protected int number = 10;
}
public class DerivedClass : BaseClass
{
    public void Print()
    {
        this.number = 20;  // you access it as a private filed 

    }
}
class Program
{
    public static void Main()
    {
        DerivedClass obj2 = new DerivedClass();
        obj2.Print();
    }
}
...