2012-10-30 5 views
-2

클래스 내부에 클래스를 정의하고 싶습니다.클래스 내부 클래스 #

예 :

private class newClient 
{ 
    public int ID { get; set; } 
    public string Name{ get; set; }   

    private class ClientExtraData 
    { 
     public string ExtraField1 { get; set; } 
     public string ExtraField2 { get; set; } 
    } 
} 

지금은 같은 방법으로 ExtraField1에 액세스하려면 :

newClient nclnt= new newClient(); 
string s=nclnt.ClientExtraData.ExtraField1; 

는이 작업을 수행 할 수 있습니까?

+2

당신이이 이상한 방법으로 해결하려는 원래 과제는 무엇입니까? – zerkms

+0

정적으로 만들거나 상위 클래스에서 인스턴스를 만듭니다. – Aphelion

+4

'ClientExtraData'를 반환하는 public 속성을 선언하는 방법 –

답변

0

아니요이 방법으로 내부 클래스에 액세스 할 수 없습니다. nclnt.ClientExtraData.ExtraField1; 속성에 액세스하려면 해당 객체의 인스턴스가 있어야하므로 nclnt.ClientExtraData.ExtraField1;입니다. 이 방법으로 newClient 외부에서 액세스 할 수 있도록하려면

class newClient 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public ClientExtraData clientExtraData{ get; set; } 

    public newClient() 
    { 
     clientExtraData = new ClientExtraData(); 
    } 

    internal class ClientExtraData 
    { 
     public string ExtraField1 { get; set; } 
     public string ExtraField2 { get; set; } 
    } 
} 

아니면 ClientExtraDatapublic 대신 internal을 만들 수 있습니다 그런 다음 당신은 private 액세스 한정자를 사용할 수 있지만,이 방법으로 internal을 사용해야합니다 :

newClient.ClientExtraData clientExtraData = new newClient.ClientExtraData(); 

그래서 당신은 할 수 있습니다 :

,674,
+0

Fuex, 고마워. – Dror

0

나는 보통 이런 식으로 이런 종류의 물건을 수행

//the two classes can live in the same code file, if you want. 
private class ClientExtraDataClass 
{ 
    public string ExtraField1 { get; set; } 
    public string ExtraField2 { get; set; } 
} 
private class newClient 
{ 
    public int ID { get; set; } 
    public string Name{ get; set; } 

    //you may want to make it a readonly property too, 
    // it depends on your needs. 
    public ClientExtraDataClass ClientExtraData = new ClientExtraDataClass(); 
} 
1

는 아니 그것은 그렇게 할 수 없습니다. 클래스는 메서드, 속성 또는 클래스에 의해 instanziated 아무것도 아닙니다.

그것은 아주 나쁜

:-) 디자인 당신은 그러나 말할 수도 :

var에 MyClass에 = 새로운 ClassOne.ClassTwo()

3

이 아래에 달성하기 위해

newClient nclnt= new newClient(); 
string s=nclnt.ClientExtraData.ExtraField1; 

당신이해야 할 일은 이런 재산을 폭로하는 것입니다.

private class NewClient 
{ 
     public class NewClient() 
     { 
      this.ClientExtraData = new ClientData(); 
     } 
     public int ID { get; set; } 
     public string Name{ get; set; } 
     public ClientData ClientExtraData {get;set;} 
} 

여기서 ClientData은 어셈블리의 한 클래스입니다.

+0

생성자에서 인스턴스를 생성하는 것을 잊지 마십시오. – Aphelion

+0

@Aphelion 클래스를 생성 할 때 Initialize 할 필요가있는 시나리오는 거의 없으므로 구현하는 개발자에게 맡깁니다. – Ramesh

+0

동의하지 않습니다. 그는 필드에 액세스하고 싶어하므로 거기에 있어야합니다.) – Aphelion

0

public 해야 코드

newClient nclnt= new newClient(); 
string s=nclnt.ClientExtraData.ExtraField1; 

newClient 클래스와 정확히이 archieve하고 ClientExtraData 클래스는 public

static해야하지만 더 나은 방법의 definetly 클래스를 만드는 것입니다 여기서 newClient는 ClientExtraData 클래스의 인스턴스에 Get-Property를 포함합니다. 이 액세스 할 수 있도록 Access Modifiers (C# Programming Guide)

0
  1. 에서

    보기는 내부 클래스를 공개합니다.

  2. 정적으로 접근 할 필요가 재산을 확인 (또는 필드에 액세스하기 위해 인스턴스를 생성)

클래스 newClient { 공공 INT의 ID {얻을; 세트; } public string Name {get; 세트; }

public class ClientExtraData 
    { 
     public static string ExtraField1 { get { return "10"; } } 
     public string ExtraField2 { get; set; } 
    } 
} 

액세스 코드 :

newClient nclnt = 새로운 newClient(); string s = newClient.ClientExtraData.ExtraField1;