Как я могу получить доступ к членам частной аннотации к классу для целей только для чтения в общедоступном классе?

#c# #class #abstract

#c# #класс #аннотация

Вопрос:

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

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

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

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

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

Комментарии:

1. private abstract class ? Как это работает?

2. @BoltClock, это должен быть вложенный класс. Это единственный возможный способ для этого работать.

3. не могли бы вы опубликовать некоторый код (классы?). В общем случае вы не можете получить доступ к закрытым членам класса, даже в производном классе. (если вопрос касается членов …)

4. @kaywai просто опубликуйте подмножество, представляющее интерес: определения классов с одним или двумя рассматриваемыми членами.

5. @kaywai, нет, не публикуйте код в разделе комментариев. Продолжайте и отредактируйте свой первоначальный вопрос. Также сузьте код до только соответствующей части.

Ответ №1:

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

например

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

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

Комментарии:

1. обязательно ли класс должен быть производным классом?

2. Да, ваши конкретные классы должны быть производными от абстрактного класса, чтобы наследовать свойства, как описано выше.

Ответ №2:

Используйте защищенный, а не закрытый. Также рассмотрите композицию вместо наследования.

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

Ответ №3:

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

Комментарии:

1. если я должен извлечь данные из абстрактного класса, все вновь созданные классы должны быть производными классами?

Ответ №4:

Если вы хотите получить доступ к данным через объект абстрактного класса 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);
    }
}
  

Ответ №5:

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

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

 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;