Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在继承上重命名变量_C# - Fatal编程技术网

C# 在继承上重命名变量

C# 在继承上重命名变量,c#,C#,我只是想知道这是否可能 我有一个基类,有一个叫做Level的变量。然后我从中派生出一个类,但这里的Level应该称为Points 有没有办法重命名派生类中的级别变量 编辑-请原谅我将属性称为变量。我对编程非常陌生,尤其是对课程(我们的老师出于某种原因没有教我们)来说。继承最接近您的是: class BaseClass { protected int Level { get; set; } } class SubClass : BaseClass { public int Points

我只是想知道这是否可能

我有一个基类,有一个叫做Level的变量。然后我从中派生出一个类,但这里的Level应该称为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?:-)