У меня есть несколько подобных классов, наследующих от одного базового класса/интерфейса (базовый класс 1), и они имеют пару похожих функций, но также имеют свои собственные функции. Все они также имеют свои собственные переменные-члены разных классов, и каждый из них наследуется от одного базового класса/интерфейса (базовый класс 2). Можно ли определить переменную в базовом классе 1 типа Base class 2, а затем в фактической реализации классов, использующих Base class 1, иметь переменную типа Base class 2, ее собственный тип. Своего трудно объяснить, поэтому упрощенный пример ниже.Родительский класс, ссылающийся на дочернюю переменную
//Base-Class 1
class Shape
{
public Shape() {}
ShapeExtra m_var;
//The common functions
public GetVar(){ return m_var; }
}
class Circle : Shape
{
public Circle() { m_var = new CircleExtra(); }
public void CircleFunc()
{
m_var.CircleExtraFunc();
}
}
class Triangle : Shape
{
public Triangle() { m_var = new TriangleExtra(); }
public void TriangleFunc()
{
m_var.TriangleExtraFunc();
}
}
.
.
.
//Base_Class 2
class ShapeExtra
{
public ShapeExtra() {}
}
class CircleExtra : ExtraClass
{
public CircleExtra() {}
void CircleExtraFunc() {//Do stuff}
}
class TriangleExtra : ExtraClass
{
public TriangleExtra() {}
void TriangleExtra() {//Do stuff}
}
.
.
.
Итак, я нужен m_var
в дочерних классах, которые будут храниться как своей собственной уникальной версии. Потому что прямо сейчас (без дополнительной CircleExtra m_var;
), то GetVar()
работает, но в CircleFunc
, m_var
еще тип ShapeExtra
, и, таким образом, не знает, что существует CircleExtraFunc
. Я мог бы накладывать m_var
каждый раз, когда я хотел это сделать, но это повторяется и не стоит в моем реальном случае. Есть ли способ использовать функции в уникальных классах, основанные на ShapeExtra
, сохраняя функцию GetVar()
в Shape
?
Пожалуйста, задавайте вопросы, если есть что-то, что я забыл.
В чем вопрос? –
Добавлено: «Есть ли способ сделать это без кастинга каждый раз?» –
«Мне нужно m_var в дочерних классах, чтобы сохранить его как свою уникальную версию». Это уже есть. 'm_var' в дочерних классах не имеет абсолютно никакого отношения к' m_var' в базовом классе. Базовый класс имеет свой собственный 'm_var', так же как и каждый дочерний класс. Они уникальны и отличаются друг от друга. В отличие от виртуальных функций, члены класса не переопределяют членов одного и того же имени в базовом классе. Ваш вопрос непонятен. –