C # Переопределения переменных-членов, используемые методом базового класса - PullRequest
5 голосов
/ 11 июля 2009

ОК, поэтому я сразу признаю, что это немного странно ... но это служит логической цели. Я использую C # для текущего проекта и пытаюсь найти способ переопределить переменную-член в производном классе, но получить доступ к переопределенной переменной в методе базового класса. Чтобы сделать вещи более «интересными», было бы предпочтительнее, если бы переопределенная переменная-член была статической (это НЕ показано в примере кода ниже).

Вот мой пример кода:

class baseclass
{
    protected string[] array = null;

    public string method()
    {
        string str = "";
        foreach (string x in this.array)
        {
            str += x + "  "; 
        }

        return str;
    }
}

class subclass1 : baseclass
{
    new string[] array = new string[]
    {
        "class1value1",
        "class1value2",
        "class1value3",
        "class1value4"
    };
}

class subclass2 : baseclass
{
    new string[] array = new string[]
    {
        "class2value1",
        "class2value2",
        "class2value3",
        "class2value4"
    };
}

Есть мысли о том, почему это не работает, и способ обойти это?

Ответы [ 5 ]

8 голосов
/ 11 июля 2009

Есть ли причина, по которой вы не можете использовать виртуальную собственность? Это обеспечит именно ту функциональность, которую вы ищете. Это просто не было бы полем.

protected abstract string[] array { get; }

...

protected override string[] array { get { return new string[]{"...","..."}; }}
1 голос
/ 01 ноября 2010

Вы пытаетесь получить полиморфное поведение из массива, но вы определяете его для локального поведения класса.

Массив должен быть виртуальным, или метод () в базовом классе будет компилироваться для постоянного доступа к массиву в базовом классе - массив также должен быть свойством, а не полем для этого, т. Е.

string [] _array = {...}; / базовый класс локальные значения защищенная виртуальная строка [] array {get {return _array; }} // делает свойство массива переопределенным

тогда в подклассах вам нужно будет сделать

string [] _array = {...}; // подкласс локальных значений виртуальная строка [] array {get {return _array; }} // это переопределяет свойство базового класса

чтобы получить желаемый эффект

1 голос
/ 11 июля 2009
class BaseClass
{
    public virtual string Method()
    {
        return string.Empty;
    }
}

abstract class BaseClass<T> : BaseClass where T : BaseClass<T>
{
    protected static string[] strings;

    public override string Method()
    {
        return string.Join("  ", strings);
    }
}

class Subclass1 : BaseClass<Subclass1>
{
    static Subclass1()
    {
        strings = new[] { "class1value1", "class1value2", "class1value3" };
    }
}

class Subclass2 : BaseClass<Subclass2>
{
    static Subclass2()
    {
        strings = new[] { "class2value1", "class2value2", "class2value3" };
    }
}

Важной частью является общий параметр T, который в основном функционирует как индекс для строковых массивов.

1 голос
/ 11 июля 2009

Просто не используйте новый. Установите массив в конструкторе вашего подкласса.

РЕДАКТИРОВАТЬ: с кодом:

class subclass1 : baseclass
{
    public subclass1()
    {
        array = new string[]
        {
            "class1value1",
            "class1value2",
            "class1value3",
            "class1value4"
        };
    }
}

class subclass2 : baseclass
{
    public subclass2()
    {
        array = new string[]
        {
            "class2value1",
            "class2value2",
            "class2value3",
            "class2value4"
        };
    }
}
1 голос
/ 11 июля 2009

Зачем вам нужно переопределить переменную? Судя по вашему коду, достаточно просто установить значения, нет?

Кроме того, статические переменные привязаны к классу (не к экземпляру), поэтому они не могут быть переопределены в любой ситуации.

...