2011-04-26 2 views
1

나는 추상 추상 멤버와 추상 멤버가 아닌 TDSeq라는 private 추상 클래스를 가지고있다. 데이터를 가져 오는 2 개의 파생 클래스가 있습니다. - 개인 클래스 TDSeqBuy : TDSeq 및 개인 클래스 TDSeqSell : TDSeq.공개 수업에서 읽기 전용으로 클래스에 대한 비공개 초록 멤버에 액세스하려면 어떻게해야합니까?

내가 액세스하려고하는 개인 추상 클래스의 멤버는 개인/공개 bools/double/정수입니다.

데이터는 파생 클래스에서 보호 추상 이름 {get;}에 의해 개인 추상 클래스로 흐릅니다. 그 후 데이터는 위에서 언급 한 개인/공개 bool/double/정수로 "이동"됩니다.

공개 클래스의 읽기 전용 목적으로 데이터에 액세스하고 싶습니다. 그러나이를 수행하는 방법을 알지 못합니다. 누군가 제발 도와 줄 수 있니?

나는 공개적으로 지난 5 라인에 액세스하기 위해 노력하고있어
private abstract class TDSeq 
{ 
    public event SetupCompletedEventHandler SetupCompleted; 

    protected abstract double TDSTHigh { get; } 
    protected abstract double TDSTLow { get; } 
    protected abstract double SetupStopLevel { get; } 
    public double highesthigh = 0; 
    public double lowestlow = 0; 
    public double truerange = 0; 
    public double setupstoplevel = 0; 

    // ... 

    case TDSTStateSetup.Completed: 
     if(ValidSetup) 
     { 
      Print = "ValidExtSetup"; 
      setupCount++; 
      SetupDrawText(); 
      //Print = NameIndex; 
     } 
     else 
     { 
      Print = "ExtSetup Finalised"; 
      tdsetupiscompleted = true; 
      if (tdsetupiscompleted) 
      { 
       Print = "tdsetupiscompleted"; 
      } 
      if (tdsetupdirection == 1) 
      { 
       Print = "tdsellsetupiscompleted"; 
      } 
      if (tdsetupdirection == -1) 
      { 
       Print = "tdbuysetupiscompleted"; 
      } 
      highesthigh = TDSTHigh; 
      lowestlow = TDSTLow; 
      truerange = (highesthigh - lowestlow); 
      setupstoplevel = SetupStopLevel; 
      stateSetup = TDSTStateSetup.Finished; 
     } 
// ... 
} 

...

+0

'private abstract class'? 어떻게 작동합니까? – BoltClock

+0

@BoltClock 중첩 클래스 여야합니다. 이것이 작동하는 유일한 방법입니다. –

+2

몇 가지 코드 (클래스?)를 게시 할 수 있습니까? 일반적으로 파생 클래스가 아닌 클래스의 전용 멤버는 액세스 할 수 없습니다. (질문에 대한 회원의 경우 ...) –

답변

2

사용은 개인되지 보호. 또한 상속에 대한 구성을 고려하십시오.

중첩 클래스는 좋은 생각이 아닙니다. 범위 만 제한됩니다. 그리고 보호하면 거기서 구해주지 않을 것입니다.

0

당신은 속성에 대한 액세스를 원하는 그들 만 읽기 전용 private 필드의 값을 저장하는 경우 - 그래서 같은 민간 분야에 액세스 만 읽어주고 보호 GET 속성을 제공 :

private abstract class A 
    { 
     private int _number = 5; 

     protected int Number { get { return _number; } } 
    } 

    private class B : A 
    { 
     public int GetNumber() 
     { 
      return Number; 
     } 
    } 

    private class C : A 
    { 
     public int GetNumber() 
     { 
      return Number; 
     } 
    } 
+0

추상 클래스에서 데이터를 추출하려면 새로 생성 된 모든 클래스가 파생 클래스가되어야합니까? – kaywai

0

별도의 공용 클래스 X의 메서드 내에서 추상 클래스 A의 개체를 통해 데이터에 액세스하려는 경우 추상 클래스는 X에 표시되어야하므로 공용이어야합니다 (또는 A X는 같은 어셈블리의 일부 임) :

public class Program 
{ 
    static void Main(string[] args) 
    { 

     B b = new B(); 
     X.Test(b); 
    } 

    // private does not work here if you want to have a parameter of type A in X 
    public abstract class A 
    { 
     private int _number = 5; 
     public int Number { get { return _number; } } 
    } 

    private class B : A 
    { 
    } 
} 

public class X 
{ 
    public static void Test(Program.A a) 
    { 
     Console.WriteLine(a.Number); 
    } 
} 
1

또한 auto 비공개 필드를 사용하지 않고 동일한 속성을 유지합니다.

어셈블리의

private abstract class A 
{ 
    protected int Number { get; private set; } 
} 

private class B : A 
{ 
    public int GetNumber() 
    { 
     return Number; 
    } 
} 
+0

클래스가 파생 클래스 여야합니까? – kaywai

+0

예, 구체적인 클래스는 파생되어야합니다. 상기와 같은 프로퍼티을 상속하는 추상 클래스. – Mike

0

최상위 클래스는 공용 또는 접근의 관점에서 내부 될 수있다, 그래서 나는 개인 추상 클래스를 가정하고 있는데 우선, 클래스가 모두 일부 공용 클래스 내부에 중첩 된 파생 된 것. 옳은?

그렇다면 공개 속성을 통해 부모 클래스 내부에서 개인 파생 클래스를 인스턴스화 한 다음 간단히 public 필드를 호출하여 비 추상화 및 공개 인 중첩 된 비공개 추상 클래스의 멤버에 액세스하면됩니다.

public class TopClass 
{ 

    DerivedClass MyDerivedClass; 

    public int GetDerivedClassPublicField 
    { 
    get 
     { 
     DerivedClass MyDerivedClass = new DerivedClass(); 
     return DerivedClass.myfield;//here is access to your abstract class field from outside 
     } 
    } 

    // Private classes must be nested 
    private abstract class AbstractClass 
    { 
    public int myfield = 1; 
    } 

    private class DerivedClass : AbstractClass 
    { 
    ... (derived classes inherit the non-abstract field from the abstract parent by default here) ... 
    } 
} 


// now call the public top level class property to get the field in the abstract class 
TopClass MyTopClass = new TopClass(); 
int myInt = MyTopClass.GetDerivedClassPublicField;