Да, это законно, доступность проверяется статически (не динамически):
class A {
public:
virtual void foo() = 0;
private:
virtual void bar() = 0;
};
class B : public A {
private:
virtual void foo() {} // public in base, private in derived
public:
virtual void bar() {} // private in base, public in derived
};
void f(A& a, B& b)
{
a.foo(); // ok
b.foo(); // error: B::foo is private
a.bar(); // error: A::bar is private
b.bar(); // ok (B::bar is public, even though A::bar is private)
}
int main()
{
B b;
f(b, b);
}
Теперь, зачем вы хотите это сделать? Это имеет значение только при непосредственном использовании производного класса B
(второй параметр f()
), а не через базовый интерфейс A
(первый параметр f()
). Если вы всегда используете абстрактный A
интерфейс (как я бы рекомендовал в целом), он по-прежнему соответствует режиму «IS-A».
Не могли бы вы просто добавить открытое строковое поле в класс?
Оно будет отображаться в Инспекторе, где вы можете сделать ввод и затем присвоить это строковое значение hintText.text
. [ 114]
Если вы используете настраиваемые ящики Inspector для создания некоторых нестандартных, сложных структур, рассмотрите возможность создания отдельного не-MonoBehaviour класса с желаемой структурой и используйте атрибут System.Serializable
, чтобы сделать объекты класса видимыми в Inspector. Вот так: