В языке доступ к переменным класса осуществляется через так называемые методы-аксессоры (свойства). Например у тебя есть переменная
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.Mobile
s и класс Mobile - это не одно и то же; Mobile является составной частью Server.Mobiles).
В общем продолжай разбираться, ты на пути к просветлению (IMG:
style_emoticons/default/biggrin.gif)