doar face clasa vizibile modul interior: masina de scris

voturi
9

Atunci o privire la următorul cod:

module MyModule {
    class MyPrivateClass {
        ...
    }

    export class MyPublicClass {
        private var: MyPrivateClass; // MyPrivateClass is unknown
    }
}

Vreau MyPrivateClass să fie vizibile doar în interiorul MyModule , în special pentru uz intern în MyPublicClass . În afara MyModule , numai MyPublicClass ar trebui să fie vizibile. M - am gândit că aspectul de mai sus ar trebui să facă , dar VS se plânge că MyPrivateClass nu este vizibil în interiorul MyPublicClass . Adăugarea de export înainte de definiția MyPrivateClass face vizibil pentru MyPublicClass dar este vizibil din exterior.

Există o modalitate de a face vizibil MyPublicClass numai?

Mulțumesc.

Întrebat 08/10/2012 la 13:28
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
7

Aici este un exemplu de lucru care arată clasa privată, clasa publică, folosind clasa privata din clasa publică și încercarea de a utiliza clasa privată, care generează o eroare.

Dacă obțineți o eroare, sunteți în măsură să dezvăluie numele pe care încercați să îl utilizați pentru modulul care cauzează problema?

module MyModule {
    class MyPrivateClass {
        doSomething() {
            return 1;
        }
    }

    export class MyPublicClass {
        private x = new MyPrivateClass();

        someFunction() {
            return this.x.doSomething();
        }
    }
}

var examplePublic = new MyModule.MyPublicClass();
var result = examplePublic.someFunction(); // 1

var examplePrivate = new MyModule.MyPrivateClass(); // error
Publicat 12/10/2012 la 17:32
sursa de către utilizator

voturi
2

Dacă doriți să fie privat în JavaScript emmitted puteți face acest lucru prin mutarea instanța CLAS privat la interiorul modulului, dar nu și în partea din clasa exportată.

module MyModule {
    class MyPrivateClass {
        prop1: number = 1;
    }

    var foo: MyPrivateClass = new MyPrivateClass();

    export class MyPublicClass {
        someMethod(){
            var bar = foo.prop1;
        }
    }
}

var x = new MyModule.MyPublicClass();
Publicat 03/01/2013 la 17:39
sursa de către utilizator

voturi
0

Ai spus într-unul din comentariile tale:

E ciudat: Dacă inserați codul ca mai sus (a ta sau a mea), e bine. Dar, de îndată ce am schimba numele modulului numelui său real eroarea am descris apare

Acest lucru sună foarte asemănător cu o problemă care am experimentat. A fost cauzată pentru că am fost folosind diferite căi de referință pentru a importa modulele. Ca rezultat în interiorul unei membrii module nu au putut accesa reciproc.

Îmi pare rău, dar nu-mi amintesc nici mai multe detalii și nu am fost în stare să se reproducă (sau mi) eroare. Acest lucru este, probabil, inutil, dar am crezut că mi-ar împărtăși experiența mea, cu toate acestea: Amestecarea căi de referință și module pare a provoca erori foarte ciudate.

Mai mult decât atât, uneori, VisualStudio se comportă destul de ciudat. Sunt lucrează în prezent la un proiect dactilografiate, împreună cu un prieten. Codul este stocat într-un repo GitHub. Amândoi tras aceeași versiune. Am lucrat bine pentru mine și a fost presărat cu mesaje de eroare pentru el. Același sistem de operare, aceeași versiune dactilografiate, aceeași versiune de VisualStudio, ... Interesant eroarea a fost legată de module, de asemenea. Un modul care a fost importat parea a fi „gol“. Tot codul care a încercat să folosească conținutul acestui modul a fost marcat roșu. El a reluat VisualStudio și dintr-o dată, codul a fost acceptat ca valid. Noi nu am schimbat nimic! Compilat fara probleme, de asemenea.

Publicat 19/01/2013 la 13:15
sursa de către utilizator

voturi
0

Hmm, eu nu văd nici o problemă cu ea, dar nu uitați să inițializa valoarea câmpului, în caz contrar compilatorul nu va genera câmpul:

module MyModule {
    class MyPrivateClass {

    }

    export class MyPublicClass {
        private instance: MyPrivateClass; // MyPrivateClass is unknown
        constructor() {
           this.instance = new MyPrivateClass();
        }
    }
}
Publicat 08/10/2012 la 13:40
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more