2011-04-26 38 views
1

我有一個叫做TDSeq的私有抽象類,其中有一些抽象成員和非抽象成員。有2個派生類,它從中獲取數據: - 私有類TDSeqBuy:TDSeq和私有類TDSeqSell:TDSeq。如何在公共課中訪問私人抽象類的成員以用於只讀目的?

我試圖訪問的私有抽象類的成員是private/public bools/doubles/integers。

數據通過受保護的抽象名稱{get;}從派生類流到私有抽象類。之後,數據被「移動」到上面提到的私人/公共布爾/雙打/整數。

我想從抽象類訪問數據的只讀目的公共類,但不知道如何做到這一點。有人可以幫忙嗎?

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; 
     } 
// ... 
} 

我想公開訪問的最後5行...

+0

'私人抽象類'?這是如何運作的? – BoltClock 2011-04-26 08:31:03

+0

@BoltClock,它必須是一個嵌套類。這是這個工作的唯一可能的方式。 – 2011-04-26 08:31:55

+2

你可以發佈一些代碼(類?)。一般來說,您不能訪問某個類的私有成員,即使在派生類中也是如此。 (如果問題是關於成員...) – 2011-04-26 08:32:41

回答

2

使用受保護的,而不是私人的。也考慮繼承構成。

嵌套類不是一個好主意。它只會限制範圍。並受到保護並不會將你保存在那裏。

0

如果你希望獲得的屬性和它們只能爲只讀,該值存儲在私人領域 - 並給予保護的獲取屬性給閱讀像這樣的私人領域唯一獲得:

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 2011-04-26 08:56:34

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

您還可以使用自動屬性可以在不使用私人字段的情況下實現同樣的效果。

例如在裝配

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

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

該類是否需要派生類? – kaywai 2011-04-26 08:55:02

+0

是的,您的具體類必須從派生類派生抽象類繼承上述屬性。 – Mike 2011-04-26 09:46:44

0

頂級類只能是公共或在無障礙方面的內部,所以我假設你的私人抽象類和它的派生類都被嵌套在一些公共類中,對於初學者。正確?

如果是這樣,只需通過一個公有屬性初始化該父類中的私有派生類,然後從其中調用公共字段,即可訪問嵌套私有抽象類的非抽象和公共的成員:

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;