#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;