Clasa publică este inaccesibilă din cauza nivelului de protecție al acesteia (Programare, C#)

jao a intrebat.
a intrebat.

Am următoarele clase:

namespace Bla.Bla 
{
    public abstract class ClassA 
    {
        public virtual void Setup(string thing) 
        {
        }

        public abstract bool IsThingValid();

        public abstract void ReadThings();

        public virtual void MatchThings() { }

        public virtual void SaveThings() { }

        public void Run(string thing) 
        {
            Setup(thing);

            if (!IsThingValid()) 
            {

            }

            ReadThings();
            MatchThings();
            SaveThings();
        }
    }
}

namespace Bla.Bla 
{
    public class ClassB : ClassA 
    {
        ClassB() { } 

        public override void IsThingValid() 
        {
            throw new NotImplementedException();
        }

        public override void ReadThings() 
        {
            throw new NotImplementedException();
        }
    }
}

Acum încerc să fac următoarele:

public class ClassC 
{
    public void Main() 
    {
        var thing = new ClassB();
        ClassB.Run("thing");
    }
}

Care returnează următoarea eroare: ClasaB este inaccesibilă din cauza nivelului de protecție.

Dar toate clasele sunt publice.

3 răspunsuri
Serghei Kalinichenko

Această eroare este un rezultat al nivelului de protecție al ClassB‘s constructor, , nu ClassB în sine. Deoarece numele constructorului este același cu numele clasei* , , eroarea poate fi interpretată incorect. Deoarece nu ați specificat nivelul de protecție al constructorului, se presupune că acesta este internal în mod implicit. Declararea constructorului public va rezolva această problemă:

public ClassB() { } 

* Se poate spune, de asemenea, că constructorii nu au un nume, ci doar un tip; acest lucru nu schimbă esența problemei.

Comentarii

  • Totuși, sunt de acord că ctor pentru ClassA poate fi protejat –  > Por Shaun Wilde.
  • Există un moment de facepalm. Mulțumesc.  > Por jleach.
  • Vă mulțumesc pentru răspuns. Modificarea constructorului în public a rezolvat problema. –  > Por Amir Md Amiruzzaman.
user2704193

De asemenea, dacă doriți să faceți ceva de genul ClassB.Run("thing");, , asigurați-vă că metoda Run(); este static sau ai putea să o numești astfel: thing.Run("thing");.

Eric Milliot-Martinez

Ați putea intra în designerul formularului web și să schimbați „webcontrols” pentru a fi „public” în loc de „protected”, dar nu sunt sigur cât de sigur este acest lucru. Prefer să fac intrări ascunse și să pun niște jQuery să seteze valorile în aceste intrări ascunse, apoi să creez proprietăți publice în clasa formularului web (codul din spate) și să accesez valorile în acest mod.

Tags: