C# 在继承上重命名变量
我只是想知道这是否可能 我有一个基类,有一个叫做Level的变量。然后我从中派生出一个类,但这里的Level应该称为Points 有没有办法重命名派生类中的级别变量C# 在继承上重命名变量,c#,C#,我只是想知道这是否可能 我有一个基类,有一个叫做Level的变量。然后我从中派生出一个类,但这里的Level应该称为Points 有没有办法重命名派生类中的级别变量 编辑-请原谅我将属性称为变量。我对编程非常陌生,尤其是对课程(我们的老师出于某种原因没有教我们)来说。继承最接近您的是: class BaseClass { protected int Level { get; set; } } class SubClass : BaseClass { public int Points
编辑-请原谅我将属性称为变量。我对编程非常陌生,尤其是对课程(我们的老师出于某种原因没有教我们)来说。继承最接近您的是:
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组成,而不是从A继承而来。不,这是不可能的。您可以使用虚拟属性覆盖该行为,但不能重命名它 有没有办法重命名派生类中的级别变量 不,停下来想一想为什么。如果您有
Base
的实例,则可以参考属性级别
。现在,如果您有一个派生的
实例,它也是一个基
,因此它应该具有名为级别
的属性。很简单:派生的
也是基
,所以无论你用基
做什么,你都应该能用派生的
来做
但是,你可以这样做:
class Base {
protected int Level { get; set; }
}
class Derived : Base {
public int Points { get { return this.Level; } set { this.Level = value; } }
}
请注意,
级别
不再公开可见。类不包含变量;它们包含字段和属性(以及方法、索引器等)
我假设您指的是属性,因为字段无论如何都不应该是公共的
无法更改从基类继承的属性的名称
您可以做什么:
选项1
除了从基类继承的属性级别
之外,添加属性点
:
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"
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
将基类转换为接口,以便实现它,从而隐藏属性级别
:
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; }
}
例如:
MyDerivedClass x = new MyDerivedClass();
x.Points = 42;
Console.WriteLine(x.Level); // prints "42"
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"
你为什么要这么做?因为这些职业本质上是一样的,但是一个有等级,另一个有分数(顺便说一下,这是一个游戏),技术上来说,这不是重命名等级。它只是通过一个新的公共财产公开它。谢谢!(这就是get和set的用途……)第二个选项实际上更符合我的要求,谢谢!不客气。请将其标记为已接受(单击投票按钮下方的复选标记),如果这是您想要的。干杯。正在等待15分钟到期;)在某些情况下,你的第一段肯定是无效的。否则,为什么C#会支持成员定义的[new关键字](属性的新关键字会得到int?:-)