Здравствуйте, гость ( Вход | Регистрация )

2 страниц V < 1 2  
Ответить в эту темуОткрыть новую тему
> Как Сделаь На Сайте Статус, сайт....
Soteric
сообщение 14.2.2008, 2:08
Сообщение #21


********

Master
Сообщений: 1.377
Регистрация: 7.8.2006
Группа: Пользователи
Наличность: 450
Пользователь №: 7.166



Mobile - это класс входящий в состав ядра RunUO. Соответственно чтобы в него заглянуть нужно скачать сервер с помошью SVN (в соседней ветке форума подробно рассказано как это сделать). Ну и естественно вызывать ты можешь только методы и переменные, которые имеют флаг public. Т.е. ближе всего ты был к истине, когда писал m.Level и m.Exp. Форма записи верная, другое дело, что для Mobile не существует такого понятия как опыт и уровень. Об этом и сообщается в ошибках.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cold
сообщение 14.2.2008, 9:16
Сообщение #22


***

Novice
Сообщений: 88
Регистрация: 21.3.2006
Группа: Пользователи
Наличность: 0
Пользователь №: 5.508



Ясно. Вот вырезка из моего playerMobile.cs ~76 строка:
Код
public class PlayerMobile : Mobile, IHonorTarget
    {
    /////////// Level System ////////////
        private int m_Level;
        private int m_MaxLevel;
        private int m_Exp;
        private int m_ToLevel;
        public int m_kxp;

        [CommandProperty(AccessLevel.GameMaster)]
        public int Level
        { get { return m_Level; } set { m_Level = value; InvalidateProperties(); } }

        [CommandProperty(AccessLevel.GameMaster)]
        public int MaxLevel
        { get { return m_MaxLevel; } set { m_MaxLevel = value; InvalidateProperties(); } }

        [CommandProperty(AccessLevel.GameMaster)]
        public int Exp
        {
            get { return m_Exp = LevelCore.TExp(this); }
            set { m_Exp = value; InvalidateProperties(); }
        }

        [CommandProperty(AccessLevel.GameMaster)]
        public int ToLevel
        { get { return m_ToLevel; } set { m_ToLevel = value; InvalidateProperties(); } }

        public int kxp
        { get { return m_kxp; } set { m_kxp = value; InvalidateProperties(); } }
        ////////// End Level System //////////


Вот тут вроде есть все те переменые и Level, и Exp. Только я не пойму, они private или public? Так что, если в "using Server.Mobiles" имеется ввиду playerMobile.cs, то в нем есть понятия об этих переменных. Почему же тогда он не хочет их выводить ? Или я что-то не так понял.


--------------------
Take me to the Breathe and BE...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Soteric
сообщение 14.2.2008, 14:46
Сообщение #23


********

Master
Сообщений: 1.377
Регистрация: 7.8.2006
Группа: Пользователи
Наличность: 450
Пользователь №: 7.166



В языке доступ к переменным класса осуществляется через так называемые методы-аксессоры (свойства). Например у тебя есть переменная private int m_Level; Как видно, ее модификатор (флаг) доступа private. Т.е. внутри класса PlayerMobile ты можешь беспрепятственно обращаться к ней, изменять ее значение, но за пределами PlayerMobile (как например в твоем случае) компилятор даст тебе ошибку (что-то вроде "variable m_Level сannot be accessed due to its protected status" - "переменная защищена и изменить ее невозможно"). Свойства реализуют доступ к таким переменным. Например:
Код
public int Level
{
    get { return m_Level; }
    set { m_Level = value; InvalidateProperties(); }
}

Это свойство имеет модификатор public и к нему можно обращаться из других классов. Если ты напишешь

m.Level = 10;

то произойдет следующее. В свойство поступит число 10 и будет присвоено переменной m_Level (выполнится метод set). Точно также если ты запрашиваешь значение этой переменной, например:

int x = m.Level;

то произойдет следующее. В свойство поступит запрос и метод get вернет (return) значение переменной m_Level. Поэтому private переменная всегда (если подразумевается ее использование в других классах) имеет свойство, через которое сообщает о себе другим классам. Это что касается модификаторов доступа.

Далее, почему он говорит, что у Mobile нет таких свойств. Их действительно нет, они есть у PlayerMobile. Это разные классы, хотя PlayerMobile является классом-потомком Mobile. А это значит, что у PlayerMobile есть все свойства класса Mobile, но у класса Mobile нет ни одного свойства класса PlayerMobile. Потомки наследуют все свойства и переменные от своих родителей, а родители в свою очередь ничего не знают о существовании своих потомков (по иерархии свойства передаются как бы сверху вниз и никак не снизу вверх, это очень важно понять). Конкретно о твоем примере. У тебя есть переменная m класса Mobile. Ты знаешь, что она является еще и PlayerMobile, но этого не знает сервер. Вот таким ходом:

PlayerMobile pm = (PlayerMobile)m;

происходит проверка является ли переменная m по совместительству PlayerMobile'ом и если является, то в новую переменную уже явно объявленную как PlayerMobile перекочевывают нужные тебе свойства класса-потомка. Пример:
Код
string name = m.Name; // Работает, потому что Name это свойство, определенное в классе Mobile
int level = m.Level; // НЕ работает, потому что Mobile понятия не имеет о свойствах своего потомка PlayerMobile

PlayerMobile pm = (PlayerMobile)m; // Не помню как это называется на умном языке, но для сервера это звучит примерно так: "Если m является PlayerMobile, то давай посмотрим какие там у него свойства и создадим новую переменную pm, включив в нее эти свойства". Если m не является PlayerMobile, то pm будет равна null
string anotherName = pm.Name; // Тоже можно, потому что PlayerMobile знает, что у класса-родителя есть такое свойство и помнит его значение
int anotherLevel = pm.Level; // Работает, потому что теперь мы ищем свойство Level не в классе Mobile, а в классе PlayerMobile


Вот так работают с переменными.

Теперь что имеется ввиду, когда мы пишем "using Server.Mobiles". Директивой using мы подключаем пространства имен. Можешь посмотреть, в каждом файле в начале идет что-нить вроде "namespace Server.Items" или "namespace Server.Mobiles" или "namespace Server.Network". Этой командой ты относишь класс к какому-либо пространству имен. Соответственно если ты хочешь, чтобы этот класс был виден в том классе где ты работаешь, то тебе нужно подключить его пространство имен. Например ты создал какой-нибудь класс и пытаешься создать в нем новую переменную:

Mobile m = new Mobile();

Сервер посмотрит по всем подключенным пространствам, не найдет в них класса Mobile и задаст вполне логичный вопрос "А че эта?" ("The type or namespace name 'Mobile' could not be found"). Чтобы этого не случилось, пишешь в заголовке using Server.Mobiles, подключив тем самым пространство имен Mobiles, содержащее в себе класс Mobile (не путай только пространство имен Server.Mobiles и класс Mobile - это не одно и то же; Mobile является составной частью Server.Mobiles).

В общем продолжай разбираться, ты на пути к просветлению (IMG:style_emoticons/default/biggrin.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cold
сообщение 14.2.2008, 17:00
Сообщение #24


***

Novice
Сообщений: 88
Регистрация: 21.3.2006
Группа: Пользователи
Наличность: 0
Пользователь №: 5.508



Во, спасибо большое! Сделал как ты посоветовал. А дальше все просто "op.Write ( pm.Level )" и "op.Write ( pm.Exp )". Все работает. (IMG:style_emoticons/default/smile.gif) Осталось теперь только сам сайт переделать (IMG:style_emoticons/default/blink.gif)


--------------------
Take me to the Breathe and BE...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

2 страниц V < 1 2
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 31.7.2025, 7:49
Designed by Nickostyle