2011-02-02 15 views
1

私はクラスの次のプロパティがあります。C#で基本クラスのプロパティを非表示にするにはどうすればよいですか?

protected Int32 MyProperty { get; set; } 

と派生クラスで私はそれを上書きしたい:

protected Long MyProperty {get ;set; } 

はそうnewキーワードでこれを行うための唯一の方法ですそれは基本クラスのプロパティを隠すことができますか?

+0

'Long MyInt'?なぜあなたはこれをやりますか? –

+0

これは単なる例だった – adamwtiko

+3

'MyInt'はあなたの例のプロパティではありません。それはフィールドです。 –

答えて

3

オーバーライドは、オーバーライドするシグネチャと同じである必要があります。したがって、フィールドのタイプを変更することはできません。

+0

それは基本署名だけではありませんか?すなわち、元の署名にダウンキャストすることができるものはすべて許容されます(したがってintに長い間は非常にうまく動作します) –

3

この方法でオーバーライドする以外の方法として、クラスを汎用的にすることがあります。

public abstract class MyClass<T> 
{ 
    public T MyValue{ get; set;} 
} 

public class MyIntClass : MyClass<int> 
{} 

public class MyLongClass : MyClass<long> 
{} 
2

あなたは、あなたがnewを指定する必要があり、それを通して新しいフィールド、作成している、MyIntフィールドをオーバーライドしていない:あなたのコードがのインスタンスとしてクラスにアクセスしている場合

protected new Long MyInt = 0; 

をお使いのベースクラス、それはあなたが直接あなたのサブクラスを呼び出した場合、それはLongとしてそれにアクセスする、Int32としてそれにアクセスします:

public class MyClass 
{ 
    protected int MyValue = 0; 
} 

public class MySubclass : MyClass 
{ 
    protected new long MyValue = 0; 
} 

void Test() 
{ 
    MyClass instance = new MyClass(); 
    instance.MyValue = 10; // int 

    MySubclass instance2 = new MySubclass(); 
    instance2.MyValue = 10; // long 

    MyClass instance3 = (MyClass)instance2; 
    int value = instance3.MyValue; // int - value is 0. 
} 
0

プロパティの修飾子としてoverrideまたはnewのいずれかを使用して、プロパティをオーバーライドすることができます。それでも、2つのプロパティは同じ型である必要があります。違いは、実際にDerivedクラスのBaseクラスのプロパティを呼び出す場合はoverrideが呼び出され、derivedクラスの場合はnewが使用されるということだけです。違いを説明しているJon Skeet氏の興味深い記事thisを参照してください。ジョンが言うように、あなたが

Base b = new Derived(); 
b.SomeMethod(); 

SomeMethodを書く場合、overrideキーワードを使用してオーバーライドして、派生クラスのメソッドが呼び出されます。 newキーワードを使用する場合は、基本クラスのメソッドSomeMethodが呼び出されます。

+0

これらは異なる種類です。 1つはLongで、1つはInt32です。 –

関連する問題