Konstruktor klasy dostępny tylko w obrębie innej klasy

0

Witam.
Spodziewam się, że to pewnie podstawowa wiedza i przyznaje się, że mam pewne braki. Potrzebuje nakierowania czy jest możliwość, aby nowy obiekt klasy był generowany w osobnej klasie, ale typ tego obiektu był dostępny globalnie... Przykład:

public class A
{
   public int ID {get;set;}
   public string Name {get;set;}
}

public class B
{
   public A NewAObject()
   {
      return new A();
   }
}

Tworzenie nowych obiektów danego typu odbywało by się tylko poprzez klasę B, ale chciałbym, aby został zachowany dostęp do typu A. Przykład:

static void Main(string[] args)
{
   B objB = new B();
   A objA = objB.NewAObject();
   //Chciałbym zablokować możliwość zrobienia
   A objA = new A();
}
0

Możesz zagnieździć A w B, wtedy new A() się nie skompiluje nawet.

0

Co mam źle? To mi się kompiluje...

    public class B
    {
        public A GetA()
        {
            return new A();
        }
        public class A
        {
            public int ID { get; set; }
            public string Name { get; set; }
        }
    }

VS podpowiedział mi taki using

using static ConsoleApplication4.B;

        static void Main(string[] args)
        {
            B objB = new B();
            A objA = objB.GetA();
            A objA1 = new A();
        }

Bez tego usinga też jestem w stanie to skompilować w ten sposób:

        static void Main(string[] args)
        {
            B objB = new B();
            B.A objA = objB.GetA();
            B.A objA1 = new B.A();
        }
0

No tak, przez B.A możesz się odwołać, ale przez A nie.

0

Czyli nie da się tego zrobić tak jak ja bym chciał? Trzeba zrobić coś na zasadzie singleton?
Ogólnie chodzi o to że mam pewną logikę po stronie klasy A i czy powinienem się przejmować że ktoś może zrobić coś "innego" tworząc obiekt "normalnie"? Nie lubię jak mi ktoś tyłek zawraca glupotami że "coś nie działa"

0
somekind napisał(a):

No tak, przez B.A możesz się odwołać, ale przez A nie.

Pozwolę sobie podrzucić inne (mam nadzieję) plastyczne wytłumaczenie:
Konstruktor A() ma niewidoczny argument do rodzicielskiego egzemplarza B, this.B albo B.this jak kto woli. Oprócz czarów syntaktycznych o jakich mówicie, i one są słuszne, warto rozumieć semantykę. Nie da się powołać A bez wskazania dla jakiej instancji B to chcemy.

edit: notacja kwalifikowana, czyli jak mówisz "using" to taki cukier syntaktyczny konieczny ale nie wystarczający do zrozumienia

0

@AdamWox: jak dla mnie, to próbujesz rozwiązać problem X/Y.
Co konkretnie złego może się stać, gdy ktoś utworzy sobie jakiś obiekt?
A jeśli obiekt jest elementem jakiegoś procesu, i nie ma on sensu poza nim, to jego klasa powinna być internal.

0

Użyj publicznego interfejsu IA implementowanego przez internal klasę A. W ogóle jak piszesz bibliotekę, to dobrze by było jakby większość publicznego api była za interfejsami, zapewni Ci to później większą elastyczność w rozwijaniu jej. To jest jedno z nielicznych dobrych miejsc na użycie interfejsów: na granicy komponentów/bibliotek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1