在继承上重命名变量

时间:2011-05-17 17:44:42

标签: c#

我只是想知道是否可能......

我有一个基类,有一个名为Level的变量。然后我从中派生出一个类,但这里的Level应该被称为Points。

有没有办法在派生类中重命名Level变量?

修改 - 请原谅我将属性称为变量。我对编程非常陌生,特别是对于课程(我们的老师由于某种原因没有教我们)

4 个答案:

答案 0 :(得分:6)

继承的最接近的是:

class BaseClass
{
  protected int Level { get; set; }
}

class SubClass : BaseClass
{
  public int Points { get { return Level; } set { Level = value; } }
}

但实际上并没有公开 BaseClass.Level,因为受保护的属性只对子类可见。

正如@Jason解释的那样,子类不能掩盖其基类的公共接口。如果你真的想这样做,你可以基础封装在一个暴露其属性的新对象中:

class A
{
   public Foo { get; set; }
   public Bar { get; set; }
   public Level { get; set;}
}

class B
{
  private A _internalA;

  public Foo { get { return _internalA.Foo; }  set { _internalA.Foo = value; } }
  public Bar { get { return _internalA.Bar; }  set { _internalA.Bar= value; } }
  public Points { get { return _internalA.Level; }  set { _internalA.Level = value; } }
}

这通常被称为组合:B由A组成,而不是从它继承。

答案 1 :(得分:2)

类不包含变量;它们包含字段和属性(以及方法,索引器等)

我假设你指的是属性,因为字段不应该是公开的。

无法更改从基类继承的属性的名称。

你能做什么:

选项1

除了从基类继承的属性Points之外,还要添加属性Level

class MyBaseClass
{
    public int Level { get; set; }
}

class MyDerivedClass : MyBaseClass
{
    public int Points
    {
        get { return this.Level; }
        set { this.Level = value; }
    }
}

示例:

MyDerivedClass x = new MyDerivedClass();
x.Points = 42;
Console.WriteLine(x.Level); // prints "42"

选项2

将基类转换为界面,以便实现explicitly,从而隐藏属性Level

interface IMyInterface
{
    int Level { get; set; }
}

class MyClass : IMyInterface
{
    int IMyInterface.Level
    {
        get { return this.Points; }
        set { this.Points = value; }
    }

    public int Points { get; set; }
}

示例:

MyClass y = new MyClass();
y.Points = 42; // works
y.Level = 99; // doesn't work

IMyInterface z = y;
z.Level = 99; // works
Console.WriteLine(y.Points); // prints "99"

答案 2 :(得分:1)

  

有没有办法在派生类中重命名Level变量?

不,停下来想想为什么一秒钟。如果您有Base的实例,则可以引用属性Level。现在,如果您有Derived的实例,它也是Base,因此它应该具有名为Level的属性。就这么简单:Derived也是Base,所以无论您使用Base做什么,都可以使用Derived

但是,你可以这样做:

class Base {
    protected int Level { get; set; }
}

class Derived : Base {
    public int Points { get { return this.Level; } set { this.Level = value; } }
}

请注意,Level不再公开显示。

答案 3 :(得分:0)

不,那是不可能的。您可以使用虚拟属性覆盖行为,但不能重命名它。