C#の:_object_は、クラスのメソッドをオーバーライドすることはできますか?
-
12-09-2019 - |
質問
私は、サンプルクラスを持っています:
class SampleClass
{
public virtual string SomeProperty{get; set;}
public virtual void SomeMethod() {
// code
}
}
私はそれを継承し、次のようにSomePropertyとのsomeMethodを上書きすることができます:
class ChildClass:SampleClass
{
public override string SomeProperty{get; set;}
public override void SomeMethod() {
// code
}
}
私はのオブジェクトのから、いないクラスからオーバーライドすることができます方法はありますか?
のようにSampleClass sampleObject = new sampleObject();
そしてsampleObject.SomeMethod()は一意である必要がありますか?おかげます。
解決
いいえ、あなたはオブジェクトごとに上書きすることはできません。あなたが別のオブジェクトに別の行動モデルを提供したい場合は、常にコンストラクタにデリゲートを渡すことができます:
public class ChildClass : SampleClass
{
private readonly Action someMethodBehavior;
public ChildClass(Action someMethodBehavior) {
this.someMethodBehavior = someMethodBehavior;
}
public override void SomeMethod() {
someMethodBehavior();
}
}
各オブジェクトが効果的に独自の動作を指定することができること。あなたも、あなたはそれがオプトインオーバーライドの一種になりたい場合は、「ただ、デフォルトのアクションを実行する」を意味するヌルデリゲートの参照を許可することができます。
他のヒント
未あなたが達成しようとしている、しかし、あなたはただどうなるのか全くわから
SampleClass sampleObject = new ChildClass();
次に、あなたはそれが実際にChildClassで、あなたの関数が仮想なので、あなたのオーバーライドされた関数が呼び出されることになるにもかかわらず、SampleClassを取った任意の関数にsampleObjectを渡すことができます。
はありません - あなたがオブジェクトからオーバーライドすることができます方法はありません!実際、私はあなたが何を誤解して、オブジェクトがクラスのインスタンスであるが - オブジェクトと思います。その自己doesntのは、メソッドとプロパティを定義したオブジェクトが、彼らはオブジェクトが「所属」へのクラスから来ています。
は、あなたがこの種のものを試してみて行う必要があるならば、あなたは
...間違った道を下って行くされているように私には聞こえあなたの質問は少し不明であるが、私はあなたが正確にあなたがやりたいことができないと思います - 無名クラスは、JavaのようにC#で存在していません。あなたは、そのインスタンスのサブクラス&メソッドのオーバーライドを作成する必要があります。あなたは、それが唯一のSampleClassとしてアクセスすることができ、そのようにあなたがコードを宣言しているクラス内のサブクラスのプライベートを行い、可能性がないChildClass
が鳴り、あなたがオーバーライドさSomeMethod()
方法と子クラスを作成しないだろう、なぜ私はわからないんだけど、...
唯一の方法は、明示的にデリゲートプロパティを保ち、これを念頭に置いてクラスを作成することがあります。その後SomeMethod()
は、(オブジェクトの作成時に設定おそらく)デリゲートを呼び出します。
デリゲートはまだしかし、プライベートまたは保護されたメンバーへのアクセスを許可されませんので、私は本当に多くの使用が表示されていない
。はありません。これは、C#でことはできません。あなたの希望の動作で新しいクラスを作成する必要があると思います。
クラスは...そのインスタンスのための青写真であるそれはなぜ青いプリントだせずにオブジェクトを作成したいです...
オブジェクトは、その青写真を反映している...すべてのランタイムは、あなたがしかし、その青写真へのアクセスを取得するためにオブジェクトを使用することができます青写真なしでオブジェクトを作成するために制限し、これは、リフレクションと呼ばれます。
私は何を最高のことは、あなたがふり、Javaの匿名クラスが何であるかを説明していると思います。 C#はいますが、匿名型とメソッドをオーバーライドすることはできません、またそれはあなたが実際に何かを上書きすることができます。