У меня есть несколько классов, и у меня возникают проблемы с доступом к свойствам, определенным в подклассах, из других методов класса.C# Доступ к свойству подкласса
У меня есть базовый класс Section
и несколько подклассов, например. SectionPlane : Section
. В каждом подклассе задан другой набор полей и свойств (в SectionPlane
, частное поле _t
и общедоступное свойство t
, а в SectionExtruded : Section
У меня есть личное поле _A
и общедоступное свойство'A ').
Раздел Класс
// General section object
public abstract class Section
{
public Section()
{}
}
класса Plane Раздел
// Section object representing a plane with thickness t
public class SectionPlane : Section
{
private double _t;
public SectionPlane(double t)
{
this.t = t;
}
public double t
{
get
{
return _t;
}
set
{
_t = value;
}
}
}
Класс Экструдированный Раздел
// Section object of some geometry with cross section area A extruded along the element it is assigned to.
public class SectionExtruded : Section
{
private double _A;
public SectionExtruded(double A)
{
this.A = A;
}
public double A
{
get
{
return _A;
}
set
{
_A = value;
}
}
}
Проблема возникает, когда я из любого подкласса класса Element
пытается получить доступ к свойствам, поскольку они не установлены в базовом классе Section
, например. в элементе Solid2D : Element
:
класса Element
public abstract class Element
{
private Section _section;
public Element(Section section)
{
this.section = section;
}
public Section section
{
get
{
return _section;
}
set
{
_section = value;
}
}
}
}
Класс Твердая 2D Элемент
// Solid2D elements can only have sections of type SectionPlane
public class Solid2D : Element
{
public Solid2D(SectionPlane section)
: base(section)
{
}
public void Calc()
{
double t = section.t; // This results in error 'Section' does not contain a definition for 't' and no extension method 't' accepting a first argument of type 'Section' could be found (are you missing a using directive or an assembly reference?)
}
}
Бар Элемент
// Bar elements can only have sections of type SectionExtruded
public class Solid2D : Element
{
public Solid2D(SectionExtruded section)
: base(section)
{
}
public void Calc()
{
double A = section.A; // This results in error 'Section' does not contain a definition for 'A' and no extension method 'A' accepting a first argument of type 'Section' could be found (are you missing a using directive or an assembly reference?)
}
}
Есть ли способ получить доступ к моей собственности t
без необходимости включать ее в базовый класс Section
? Это было бы очень полезно, так как не все разделы, которые я буду использовать, имеют те же свойства.
Чтобы получить доступ к свойствам 'SectionPlane', вы должны сначала преобразовать тип объекта в' SectionPlane'. Тим С. сказал это первым, но пост Оливье Жако-Дескомба гораздо более ясен по этому вопросу. – Trisped
У меня был тот же вопрос несколько недель назад (http://stackoverflow.com/questions/10804578/design-pattern-for-specialized-properties-in-subclasses), и я должен сказать, что вы дали прекрасное объяснение проблемы далеко лучше, чем моя. Во всяком случае, моим решением было добавить поле 'SectionPlane sectionPlane' в' Solid2D' и инициализировать его в конструкторе. В моем случае этого было достаточно, поскольку он был только для чтения. Возможно, вам придется переопределить свойство 'section' (setter). –