我只是想知道是否可能......
我有一个基类,有一个名为Level的变量。然后我从中派生出一个类,但这里的Level应该被称为Points。
有没有办法在派生类中重命名Level变量?
修改 - 请原谅我将属性称为变量。我对编程非常陌生,特别是对于课程(我们的老师由于某种原因没有教我们)
答案 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)
不,那是不可能的。您可以使用虚拟属性覆盖行为,但不能重命名它。