Поле является фиксированным значением для каждого класса, поле не является зависимым экземпляром ...? - PullRequest
1 голос
/ 16 июля 2010

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

числовое значение является фиксированным значением для каждого класса, число не зависит от экземпляров, а число поддерживает полиморфизм. Как я могу это сделать ? Или есть другое решение не использовать ненужное поле номера для экземпляров?

abstract class Main
{
    public int number;
    public virtual void dostuff(){
        int x = number;
    }
}
class Derived:Main
{

    public ovverride void dostuff(){
        int x = number;
    }
}

Ответы [ 2 ]

0 голосов
/ 16 июля 2010

Вы могли бы просто сделать число свойством и инициализировать в каждом конструкторе класса:

abstract class Main
{
    public int number{get; private set;}

    public void dostuff(){
        int x = number;
    }
}

class Derived:Main
{
    public Derived()
    {
        number = 5; // Specific value for each derived class
    }
    public void dostuff(){
        int x = number;
    }
}

Похоже, я получил неправильный конец флешки - вы хотите иметь возможность установить это статически для каждого типа класса, на который уже дан ответ.

0 голосов
/ 16 июля 2010

Вы можете сделать свойство статическим, а затем добавить его к каждому классу:

   abstract class Main
{
    public static int number;
    public virtual void dostuff(){
        int x = Main.number;
    }
}
class Derived : Main
{
    public static int number;
    public overide void dostuff(){
        int x = Derived.number;
    }
}

Изменить: Я немного смущен вашими комментариями о полиморфизме, поэтому я добавил еще несколько примеров.

Main obj = new Derived();
obj.doStuff(); //This will use Derived.number; as doStuff is and overidden virtual method.

Однако, если вы делаете следующее:

abstract class Main
{
    public static int number;
    public void dostuff(){
        int x = Main.number;
    }
}
class Derived : Main
{
    public static int number;
    public new void dostuff(){
        int x = Derived.number;
    }
}

Тогда вы получите другое поведение, как показано ниже:

Main obj = new Derived();
obj.doStuff() // Will use Main.number
Derived obj2 = (Derived)obj;
obj2.doStuff() // Will use Derived.number

Если вы хотите другое поведение, которое я здесь не определил, пожалуйста, exaplin, потому что я не понимаю, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...