2011-05-17 148 views
2

我只是想知道是否有可能..重命名变量继承

我有一个基类,一个变量称为级别。然后我从中派生出一个类,但是这里Level应该叫做Points。

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

编辑 - 打电话给属性变量。我很新的节目,特别是对类(我们的老师不教我们出于某种原因)

+1

为什么要做这个? – delnan 2011-05-17 17:47:34

+0

因为这些课程在本质上是相同的,但其中一个有水平,另一个有分数(顺便说一下这是一款游戏) – 2011-05-17 17:52:18

回答

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

从技术上讲,这不是重命名水平。它只是通过一个新的公共财产公开它。 – CodeNaked 2011-05-17 17:49:06

+0

谢谢! (所以这就是获取和设置可用于..) – 2011-05-17 17:49:54

+1

好点。用另一种方法更新了我的答案。 – 2011-05-17 17:54:51

0

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

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不再公开可见。

+0

必须有第一段无效的情况。否则,为什么C#会为成员定义支持[new关键字](属性的new关键字会让你int)? :-) – CodeNaked 2011-05-17 17:53:30

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"