2016-02-08 3 views
0

Я программирую игру. На каждом уровне есть класс (level1, level2 и т. Д.), Который сообщает игре, которая пытается создать плюс другие вещи. Каждый уровень имеет интерфейс iLevel.C#: попытка вызова метода в классе

Все объекты сцены имеют доступ к чему-либо в iLevel, но иногда я хочу вызвать метод, который существует только в конкретном классе уровня.

Например:

public class Level1, iLevel { 
    public int GetANumber() { 
     return 5; 
    } 
} 

Вызывающий класс должен это сделать:

public class SomeObject { 
    iLevel myLevel = new iLevel(); 
    int x = ... // now I need to call GetANumber() without knowing that object is Level1, Level2, etc. 
} 

Я считаю, что нужно использовать как-то вызвать, но я не смог заставить его работать. Я прочитал документацию по msdn, но мне все еще не удалось заставить ее работать.

Большое вам спасибо за помощь!

+0

Вы должны прочитать об интерфейсах, наследования и переопределения метода первой. –

+1

Вы должны ссылаться на концепции объектно-ориентированного программирования, которые помогли бы их реализовать. Следующая [ссылка] (https://msdn.microsoft.com/en-us/library/ms173152.aspx) даст больше информации. – Chris

ответ

1

Здесь либо вы можете использовать, если условие с является и как операторы или сделать iLevel абстрактный класс с GetNumber возвращаются отрицательные значения по умолчанию.

public class SomeObject { 
    iLevel myLevel = new iLevel(); 
    int x = -1; 

    if(myLevel is Level1) { 
     x = (myLevel is Level1).GetANumber(); 
    } 
} 

Или

public abstract class iLevel { 
    public virtual int GetANumber() { 
     return -1; 
    } 
} 

public class Level1 : iLevel { 
    public override int GetANumber() { 
     return 5; 
    } 
} 
+0

Этот (первый вариант) не является хорошей практикой объектно-ориентированного программирования. Здесь вы побеждаете использование интерфейса и общего программирования. Чтобы лучше ответить, вызов специального метода в случае Level1 должен быть вызван из метода «GetANumber» или любого другого метода, который реализован в этом классе. – Chris

+0

@ Крис, я предложил два решения. Первый не повлияет на существующую систему. –

+0

Я видел ваше второе сообщение после моего сообщения. Мой комментарий для вашего первого варианта. Теперь я отредактировал свой комментарий, чтобы он не путал пользователей. Второй вариант, который вы опубликовали, является лучшим. Все еще есть некоторые синтаксические ошибки в определении класса в наследовании базового класса, а также метод базового класса не объявляется с виртуальным. Несмотря на то, что первый не повлияет на существующую систему, не рекомендуется поощрять такую ​​практику программирования. – Chris

Смежные вопросы