2011-05-17 131 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"