Как я могу получить доступ к членам частного реферата для класса только для чтения в открытом классе? - PullRequest
2 голосов
/ 26 апреля 2011

У меня есть закрытый абстрактный класс, называемый TDSeq, в котором есть некоторые абстрактные члены и неабстрактные члены.Есть 2 производных класса, из которых он получает данные: - закрытый класс TDSeqBuy: TDSeq и закрытый класс TDSeqSell: TDSeq.

Члены частного абстрактного класса, к которому я пытаюсь получить доступ, являются частными / публичными bools / doubles/integers.

Данные передаются из производных классов в закрытый абстрактный класс с помощью защищенного абстрактного имени {get;}.После чего данные «перемещаются» в вышеупомянутые частные / публичные bool / doubles / inteers.

Я хотел бы получить доступ к данным только для чтения из абстрактного класса в открытый класс, но не знаюкак это сделать.Может ли кто-нибудь помочь, пожалуйста?

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 строкам ...

Ответы [ 5 ]

3 голосов
/ 26 апреля 2011

Использование защищено, а не личное. Также рассмотрите состав по наследству.

Вложенные классы не очень хорошая идея. Это только ограничивает область применения. И защищенный не спасет вас там.

2 голосов
/ 26 апреля 2011

Вы также можете использовать автоматические свойства, чтобы получить то же самое, не используя личное поле.

например,

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

private class B : A
{
    public int GetNumber()
    {
        return Number;
    }
}
0 голосов
/ 24 апреля 2017

Классы верхнего уровня в сборке могут быть общедоступными или внутренними только с точки зрения доступности, поэтому я предполагаю, что ваш частный абстрактный класс и его производные классы все вложены в некоторый открытый класс, для начала. Правильно?

Если это так, просто получите доступ к членам вложенного частного абстрактного класса, которые не являются абстрактными и общедоступными, сначала создав экземпляр частных производных классов внутри этого родительского класса с помощью, скажем, открытого свойства, а затем просто вызовите из него открытое поле:

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;
0 голосов
/ 26 апреля 2011

Если вы хотите получить доступ к данным через объект абстрактного класса A в методе отдельного открытого класса X, абстрактный класс должен быть видимым для 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);
    }
}
0 голосов
/ 26 апреля 2011

Если вы хотите, чтобы доступ к свойствам и их доступ был только для чтения, сохраните значения в частных полях - и предоставьте защищенное свойство 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;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...