2010-01-06 161 views
0

在下面的例子中,会发生什么?C#隐藏成员

class Base { 
    public int abc = 3; 
} 

Class Derived : Base { 
    public int abc = 2; 
} 

static void Main() { 
    Derived blah = new Derived(); 
    Console.WriteLine(blah.abc); 
} 

我敢肯定,你会看到“2”你的控制台上,但我在读什么(看到)反对一切......

为什么你会看到“3”,而不是' 2' ?我认为衍生类的成员'隐藏'基类的相同成员...

回答

0

忽略你的代码中显而易见的错误:O,你断言“我确信你会看到'2'控制台“是正确的,你会和我做的!

你真的应该用户

class Derived : Base { 
    public new int abc = 2; 
} 

如果隐藏继承的价值是你的意图

0

当然你会看到。你为什么认为你会看到3?

但你会得到一个警告:

'Derived.abc' 隐藏继承成员 'Base.abc'。如果打算使用 隐藏,则使用新关键字。

所以,你可以解决它这样做的:

class Derived : Base { 
    public new int abc = 2; 
} 
9

好了,你有几个编译器错误,但这里是根据你的榜样修正版本。

class Base { 
    public int abc = 3; 
} 

class Derived : Base { 
    public int abc = 2; 
} 

static void Main(string[] args) 
{ 
    Derived foo = new Derived(); 
    Console.WriteLine(foo.abc); 
    Base bar = new Derived(); 
    Console.WriteLine(bar.abc); 
} 

第一行将输出一个2。第二行将输出一个3。之所以这样,是因为,除非你明确地重写了一个基类的成员,否则它将只适用于具体类的实例。

在您的派生类中,基本上使用new modifier keyword而不明确使用它。 new关键字隐藏了一个基本成员,但是如果具体类被强制转换为其基类型,则新属性不会被使用,并且只有在它再次“强制”到具体类时才能被访问。

在第二个例子中,Derived类被铸造为Base,所以它会使用Baseabc属性。如果您要使用override keyword,则第二行也会输出2

编辑:记住记住,为了允许在Derived类使用override,你需要标记Base.abcvirtual keyword。此外,您不能使fieldsvirtual。您需要使用Properties才能使用virtual关键字。尽管如此,你不应该暴露领域,所以这通常不是问题。

+0

打我吧。好答案! – 2010-01-06 20:29:21

+0

嗯,我以为这年龄以前,但我总是得到: “错误CS0106:修饰符'重写'不适用于此项” – Xenoprimate 2010-01-06 20:40:50

+0

您需要添加'虚拟'到基类的属性,以便使用'覆盖派生类。 – 2010-01-06 20:58:04