我只是想知道是否有可能..重命名變量繼承
我有一個基類,一個變量稱爲級別。然後我從中派生出一個類,但是這裏Level應該叫做Points。
有沒有辦法在派生類中重命名Level變量?
編輯 - 打電話給屬性變量。我很新的節目,特別是對類(我們的老師不教我們出於某種原因)
我只是想知道是否有可能..重命名變量繼承
我有一個基類,一個變量稱爲級別。然後我從中派生出一個類,但是這裏Level應該叫做Points。
有沒有辦法在派生類中重命名Level變量?
編輯 - 打電話給屬性變量。我很新的節目,特別是對類(我們的老師不教我們出於某種原因)
,你可以用繼承獲得最接近的將是:
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的,而不是繼承從中。
從技術上講,這不是重命名水平。它只是通過一個新的公共財產公開它。 – CodeNaked 2011-05-17 17:49:06
謝謝! (所以這就是獲取和設置可用於..) – 2011-05-17 17:49:54
好點。用另一種方法更新了我的答案。 – 2011-05-17 17:54:51
不,這是不可能的。您可以使用虛擬屬性覆蓋該行爲,但不能重命名它。
有沒有辦法在派生類中重命名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
不再公開可見。
必須有第一段無效的情況。否則,爲什麼C#會爲成員定義支持[new關鍵字](屬性的new關鍵字會讓你int)? :-) – CodeNaked 2011-05-17 17:53:30
類不包含變量;他們包含字段和屬性(和方法,索引等)
我假設你指的是屬性,因爲字段不應該是公開的。
無法更改從基類繼承的屬性的名稱。
你可以做什麼:
選項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"
爲什麼要做這個? – delnan 2011-05-17 17:47:34
因爲這些課程在本質上是相同的,但其中一個有水平,另一個有分數(順便說一下這是一款遊戲) – 2011-05-17 17:52:18