2010-07-01 7 views
0

Je me demandais s'il était impossible de mettre en place un accesseur pour vous permettre d'accéder à la variable du accesseur .. Exemple d'erreur:accès, à l'problème

public void Main() 
    { 
     Object.name = "test"; //Can't access the object's subproperties 
    } 

    Objec ob = new Objec(); 
    public Objec Object 
    { 
     get { return ob; } 
     set { ob = value; } 
    } 
class Objec 
{ 
    string name; 
    string value; 
} 

est-il de toute façon de faire ci-dessus (autre que faire des accesseurs pour chaque valeur)?
Merci,
Max

EDIT: Voici un meilleur exemple

public void Main() 
    { 
     //Now I can't change the X or Y properties, this will display an error 
     ThePoint.X = 10; 
     //To change the x value, I need to do the following: 
     ThePoint = new Point(10,0); 
    } 

    private Point Poi = new Point(); 
    public Point ThePoint 
    { 
     get { return Poi; } 
     set { Poi = value; } 
    } 

est-il un moyen de faire fonctionner 'ThePoint.X' (sans juste d'afficher publiquement 'Poi')?

+3

Pouvez-vous être plus clair. Cela n'a pas vraiment de sens pour moi en tant que question de langage C# à moins que vous ayez juste plusieurs erreurs. Cependant, vous pourriez être intéressé par Auto-Implemented Properties s'il s'agit de C#. - http://msdn.microsoft.com/en-us/library/bb384054.aspx – BobbyShaftoe

+1

'public void Object' n'a pas de sens. Devrait-il être un objet Objec public? – Jacob

+0

Le meilleur exemple est suffisant pour nous montrer quel est le vrai problème. –

Répondre

0

La réponse à votre question actuelle "Y at-il de toute façon à faire ce qui précède (autre que de faire des accesseurs pour chaque valeur)?" est NON.

Deviner un peu sur vos intentions, vous semblez vouloir suivre un modèle de conception connu sous le nom Bridge (votre classe est une abstraction autour de la mise en œuvre de Object et/ou Point). Vous exposerez uniquement à l'audience de votre classe les éléments de la mise en œuvre d'origine que vous souhaitez, dans le cas de votre question, toutes les valeurs.

1

Vous devez rendre les variables de nom et de valeur publiques pour que votre solution soit compilée. Ou mieux encore, utilisez des propriétés automatiques.

+0

Euh, non. Tout le but des propriétés est de garder la syntaxe des champs publics tout en offrant un moyen de garder ces champs privés. –

+0

Steven, je comprends cela, mais je réponds à sa question sur la façon de le faire fonctionner, et non sur la façon de le rendre meilleur du point de vue de la conception. –

+0

Si vous recommandez quelque chose que vous savez est une mauvaise idée, s'il vous plaît dire. –

2

Je suppose que vous n'avez pas envoyé de code complet. J'imagine que vous ne pouvez pas accéder à Objec.name parce que c'est une variable privée (et donc inaccessible depuis Main()).

Essayez:

class Program 
{ 
    public static void Main(string args[]) 
    { 
     MyClass instance = new MyClass(); 
     instance.Child.ChildValue = "something"; 
    } 
} 

public class MyClass 
{ 
    // The following code declares Public Properties 
    // rather than private variables. 

    public string Value { get; set; } 
    public string Name { get; set; } 
    public MyChild Child { get; set; } 

    public MyClass() 
    { 
     this.Child = new MyChild(); 
    } 
} 

public class MyChild 
{ 
    public string ChildValue { get; set; } 
} 
0

Vous devez apporter les modifications suivantes:

public void Main() 
{ 
    Object.name = "test"; //Can access the object's properties now... 
} 

Objec ob = new Objec(); 

public Objec Object 
{ 
    get { return ob; } 
    set { ob = value; } 
} 

public class Objec 
{ 
    public string name {get; set;} 
    public string value {get; set;} 
} 
+0

Cela ne compilera pas, bien que pour être juste, c'est parce que vous avez copié les erreurs de l'original. –

+0

@Steven, merci, j'ai fait les corrections. Tout ce que je voulais faire était d'illustrer les propriétés auto-implémentées, devenues imprudentes ...! – code4life

+0

Cela ne fonctionne toujours pas du tout. Encore une fois, cela est principalement dû à la source. –

1

Vous devez spécifier le public pour tous les membres de la classe que vous souhaitez exposer en C#.

Selon le C# specification:

Class members, including nested classes and structs, can be public, protected internal, protected, internal, or private. The access level for class members and struct members, including nested classes and structs, is private by default.

2

Ok, avec votre nouvel exemple, il est clair que le problème est le suivant: vous agissez comme si le point était une classe quand il est en fait un struct.

Lorsque vous dites ThePoint.X = 10;, tout ce que vous faites est de changer le X pour un copie du point d'origine. C'est parce qu'une structure est toujours passée par valeur, pas par référence.

En bref, l'erreur est dans vos attentes.