我有以下课程:
// 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
并获取值,如果为真。我会对任何决定感到满意。
答案 0 :(得分:2)
您正在使用Options
关键字隐藏new
字段,因此只有在MyModule
调用时才能访问该字段。
Module.Params
和MyModule.Params
之间没有任何关联,即使运行时知道Mod
是MyModule
,它仍会从{{1}获取值},这是Module.Params
。
请参阅Knowing When to Use Override and New Keywords
如果你想要真正的继承,你需要使用虚方法(或者在这种情况下,虚拟属性):
null
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; }
}
}
答案 1 :(得分:1)
答案 2 :(得分:0)
Mod被视为模块,因此Params始终是选项。您应该首先将Mod转换回MyModule
答案 3 :(得分: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);
}