C#基类方法使用的成员变量覆盖

时间:2009-07-10 23:44:48

标签: c# override

好的,所以我承认这是有点棘手......但它确实有逻辑作用。我正在使用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 个答案:

答案 0 :(得分:8)

你有什么理由不能使用虚拟财产吗?这将提供您正在寻找的功能。它不会是一个领域。

protected abstract string[] array { get; }

...

protected override string[] array { get { return new string[]{"...","..."}; }}

答案 1 :(得分:1)

为什么需要覆盖变量?从你的代码看,只需设置值就足够了,不是吗?

另外,静态变量与类(不是实例)绑定,因此在任何情况下都不能覆盖。

答案 2 :(得分:1)

根本不要使用新的。在子类的构造函数中设置数组。

编辑:代码:

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

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

答案 3 :(得分:1)

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,它基本上作为字符串数组的索引。

答案 4 :(得分:1)

您正在尝试从数组中获取多态行为,但您要为类本地行为定义它。

数组必须是虚拟的,或者基类中的method()将编译为始终访问基类中的数组 - 数组也应该是属性而不是字段来执行此操作,即

string [] _array = {...}; / base class local values protected virtual string [] array {get {return _array; }} //使数组属性可覆盖

然后在子类中,你需要做

string [] _array = {...}; //子类本地值 virtual string [] array {get {return _array;这将覆盖基类属性

以获得理想的效果