Страница 1 из 2

Наследование переменных

СообщениеДобавлено: 16 апр 2017, 20:33
EagleOwle
Приветствую.
Подскажите, кому не лень.
У меня есть базовый класс и несколько классов наследником.
Можно ли как-то, в конкретном классе наследнике, скрыть или заблокировать к изменению, конкретную переменную, которая наследуется от базового класса?

Re: Наследование переменных

СообщениеДобавлено: 17 апр 2017, 01:54
Paul Siberdt
Переменные базового класса с областью видимости private недоступны для прямого обращения/изменения из наследуемых классов.

Re: Наследование переменных

СообщениеДобавлено: 17 апр 2017, 10:31
lawsonilka
Сделайте переменную свойством, а свойство виртуальным. Перегружайте свойство и блокируйте его изменения. Ну или используйте модификатор new.

Re: Наследование переменных

СообщениеДобавлено: 18 апр 2017, 08:36
EagleOwle
lawsonilka, а можно пример кода, а то для меня это сложновато.
Если не сложно...

Re: Наследование переменных

СообщениеДобавлено: 18 апр 2017, 09:20
ilka
Синтаксис:
Используется csharp
public class Parent {

 private int parentNumber;
 
 public virtual int number {
  get { return this.parentNumber;}
  set { this.parentNumber = value;}
 }

}

public class Child : Parent {

 [System.Obsolete("Property 'number' is disabled at child instance")]
 public override sealed int number {
  get { throw new OverflowException();}
  set { throw new OverflowException();}
 }

}

Теперь свойство number не будет работать а также будет перечеркнуто для использования в подсказках.

Re: Наследование переменных

СообщениеДобавлено: 18 апр 2017, 10:06
samana
ilka писал(а):System.Obsolete

Даже не догадывался о существовании подобной шутки, спасибо!

Re: Наследование переменных

СообщениеДобавлено: 19 апр 2017, 12:26
EagleOwle
Не совсем то, что мне нужно...
Суть в том, что мне нужно, неиспользуемое классом-наследником поле, скрыть для изменений в инспекторе. Или каким либо образом пометить, что в данном классе данное поле не используется.

Re: Наследование переменных

СообщениеДобавлено: 19 апр 2017, 13:22
samana
Возможно это повод поразмыслить над тем, а нужно ли это свойство в базовом классе?

Re: Наследование переменных

СообщениеДобавлено: 19 апр 2017, 13:31
ilka
EagleOwle писал(а):Не совсем то, что мне нужно...
Суть в том, что мне нужно, неиспользуемое классом-наследником поле, скрыть для изменений в инспекторе. Или каким либо образом пометить, что в данном классе данное поле не используется.

Пишите свой редактор для скрипта и скрывайте не нужные поля.

Re: Наследование переменных

СообщениеДобавлено: 19 апр 2017, 17:17
EagleOwle
В общем решил задачу множественным наследованием (или как это там называется)
В базовом классе оставил поля и методы, которые точно используют все наследники.
От него наследовал уже более "узконаправленные" поля и методу, и от этого уже финальные классы.
Как-то так в общем...

Re: Наследование переменных

СообщениеДобавлено: 23 апр 2017, 12:45
EagleOwle
Возник у меня очередной бредовый вопрос.
Можно ли менять атрибуты класса\поля после обьявления, присвоения значения...
Что я хочу добиться.
У меня есть конфиг обьекта. Класс, наследованный от scriptableObject.
В экземпляре управляющего класса есть ссылка на класс конфиг.
При старте я нахожу нужный мне класс-конфиг и сохраняю ссылку на него в управляющем классе.
Соответственно эта ссылка доступна для изменений.
Я хочу, что бы изменения в настройки игрового персонажа можно было вносить только в классе-конфиге, но в инспекторе можно было видеть значения полей
в ссылке на класс-конфиг.
Появилась идея присвоить ссылке на класс-конфиг атрибут readonly, но после того, как ссылка получит нужное её значение.

Немного запутано... но может поможете.

Re: Наследование переменных

СообщениеДобавлено: 23 апр 2017, 14:46
samana
EagleOwle писал(а):Я хочу, что бы изменения в настройки игрового персонажа можно было вносить только в классе-конфиге, но в инспекторе можно было видеть значения полей в ссылке на класс-конфиг.

По идее вам нужен эдитор одного типа в эдиторе другого типа https://docs.unity3d.com/ScriptReferenc ... ditor.html

Re: Наследование переменных

СообщениеДобавлено: 25 апр 2017, 22:20
EagleOwle
Продолжаю мучить себя и всех.
Возник такой вопрос...
Что я хочу получить:
Создается конфиг-класс наследованный от objConfig : scriptableObject.
В этом конфиге сериализованные ссылки на классы с описанием частей игрового обьекта.
При чем в зависимости от условия, ссылки должны быть на различные классы.
На пример есть конфиг Ship.
В нем enum {smoll, middle, big}
Если currentEnum == Enum smoll то должна быть ссылка на класс smolShip.
Как-то так...

Как я пытался реализовать:
Создал класс ship.
От него классы smollShip, middleShip, bigShip
В классе - конфиге обьявил поле типа Ship, присвоил ему ссылку на класс smollShip.
Все поля родительского класса доступны, но вот поля и методы класса smollShip, естественно не видны.

Вопрос, как подобный механизм можно реализовать. Что бы в итоге у меня получился класс objConfig : scriptableObject c динамически изменяемыми ссылками.

Извините, если пишу бред. Просто не знаю, как такой конструктор - конфиг можно реализовать.

Re: Наследование переменных

СообщениеДобавлено: 26 апр 2017, 08:17
seaman
Я вот не понял чем таким отличается smallShip от middleShip, что под него нужен отдельный класс? Размер, текстуры, модели, стоимость, даже наличие/отсутствие неких пушек - это не отличие требущее отдельного класса.

Re: Наследование переменных

СообщениеДобавлено: 26 апр 2017, 09:45
EagleOwle
Про ship-ы я абстрактный пример привел. У меня различные части робота, функционал которых может кардинально отличатся друг от друга.
В идеале я хочу создать конструктор, который по конфигу сам соберет робота. Что бы любой человек мог выбрать нужные части робота, нажать play и робот появится на сцене. Что бы меняя значения в конфиге динамически менялись значения на роботе, прямо в процессе игры. Что б даже меши можно было менять.
Сейчас актуальный вопрос, ссылки на классы, обробатывающие поведение частей робота в классе - конфиге. Как можно реализовать динамическую смену ссылок.