私はクラスの次のプロパティがあります。C#で基本クラスのプロパティを非表示にするにはどうすればよいですか?
protected Int32 MyProperty { get; set; }
と派生クラスで私はそれを上書きしたい:
protected Long MyProperty {get ;set; }
はそうnew
キーワードでこれを行うための唯一の方法ですそれは基本クラスのプロパティを隠すことができますか?
私はクラスの次のプロパティがあります。C#で基本クラスのプロパティを非表示にするにはどうすればよいですか?
protected Int32 MyProperty { get; set; }
と派生クラスで私はそれを上書きしたい:
protected Long MyProperty {get ;set; }
はそうnew
キーワードでこれを行うための唯一の方法ですそれは基本クラスのプロパティを隠すことができますか?
オーバーライドは、オーバーライドするシグネチャと同じである必要があります。したがって、フィールドのタイプを変更することはできません。
それは基本署名だけではありませんか?すなわち、元の署名にダウンキャストすることができるものはすべて許容されます(したがってintに長い間は非常にうまく動作します) –
この方法でオーバーライドする以外の方法として、クラスを汎用的にすることがあります。
public abstract class MyClass<T>
{
public T MyValue{ get; set;}
}
public class MyIntClass : MyClass<int>
{}
public class MyLongClass : MyClass<long>
{}
あなたは、あなたが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.
}
プロパティの修飾子としてoverrideまたはnewのいずれかを使用して、プロパティをオーバーライドすることができます。それでも、2つのプロパティは同じ型である必要があります。違いは、実際にDerived
クラスのBase
クラスのプロパティを呼び出す場合はoverride
が呼び出され、derived
クラスの場合はnew
が使用されるということだけです。違いを説明しているJon Skeet氏の興味深い記事thisを参照してください。ジョンが言うように、あなたが
Base b = new Derived();
b.SomeMethod();
とSomeMethod
を書く場合、override
キーワードを使用してオーバーライドして、派生クラスのメソッドが呼び出されます。 new
キーワードを使用する場合は、基本クラスのメソッドSomeMethod
が呼び出されます。
これらは異なる種類です。 1つはLongで、1つはInt32です。 –
'Long MyInt'?なぜあなたはこれをやりますか? –
これは単なる例だった – adamwtiko
'MyInt'はあなたの例のプロパティではありません。それはフィールドです。 –