3

次のクラスがあります。

// abstract
abstract class Module
{
    public Options Params;
}

abstract class Options { }

// implementation
class MyModule : Module
{
    public new MyOptions Params = new MyOptions();
}

class MyOptions : Options
{
    public string Param1;
}

そしてコード:

var MyMod = new MyModule();
MyMod.Params.Param1 = "new value"; // ok

// convert
Module Mod = MyMod; // if use MyModule Mod - ok
if (Mod.Params as MyOptions != null)
{
    MessageBox.Show("cast OK"); // not execute
}

モジュールはさまざまなタイプにすることができますが (私にはわかりません)、常に Module から継承されます。フィールドParamsがインスタンス(または実装)であるかどうかを判断しMyOptions、真の場合は値を取得する必要があります。私はどんな決定にも満足します。

4

4 に答える 4

2

キーワードを使用してOptionsフィールドを非表示にしているnewため、から呼び出された場合にのみアクセスできますMyModule

Module.Paramsと の間に接続はありませんMyModule.Params。ランタイムModは が であることを認識していMyModuleても、 から値を取得します。Module.Paramsこれはnullです。

Override および New キーワードをいつ使用するかを理解するを参照してください。

真の継承が必要な場合は、仮想メソッド (この場合は仮想プロパティ) を使用する必要があります。

abstract class Module
{
    public abstract Options Params { get; set; }
}

class MyModule : Module
{
    private Options myParams = new MyOptions();
    public override Options Params
    {
        get { return myParams; }
        set { myParams = value; }
    }
}

var MyMod = new MyModule();
(MyMod.Params as MyOptions).Param1 = "new value";

Module Mod = MyMod;
if (Mod.Params as MyOptions != null)
{
    Console.WriteLine("cast OK"); 
}
于 2013-10-03T10:04:59.500 に答える
1

あなたが探しているis

if(Mod.Params is MyOptions)
{
}

is operatorについてお読みください。

isキャストしてnullをチェックする必要がないため、常に使用することをお勧めします。ここで試してみてください

于 2013-10-03T10:00:26.213 に答える
0

Mod はモジュールと見なされるため、Params は常に Options です。まず Mod を MyModule にキャストする必要があります

于 2013-10-03T10:11:33.330 に答える
0

また、論理的で簡潔なバージョン:

abstract class Module
{
    public Options Params { get; protected set; }
}
abstract class Options { }

class MyModule : Module
{
    public MyOptions MyParams
    {
        get
        {
            if (Params == null) Params = new MyOptions();
            return Params as MyOptions;
        }
    }
}

class MyOptions : Options
{
    public string Param1;
}

使用:

var MyMod = new MyModule();
MyMod.MyParams.Param1 = "new value";

// convert
Module Mod = MyMod;
var Params = Mod.Params as MyOptions;

if (Params != null)
{
    MessageBox.Show(Params.Param1);
}
于 2013-10-03T10:38:35.330 に答える