如果我有一个非常简单的类,那么:
public class Example
{
public int Number { get; set; }
public Example(int numberArg)
{
this.Number = numberArg;
}
}
我有一个像这样的派生类:
public class AnotherExample : Example
{
public int DoubleNumber
{
get
{
return this.Number * 2;
}
}
public AnotherExample(int numberArg) : base(numberArg) {}
}
如果我使用this.Number
来引用AnotherExample
对象基础Number
属性,而不是使用base.Number
来引用它,那么会有什么区别?
谢谢!
答案 0 :(得分:3)
如果Number
未被覆盖,则没有区别,因为this.Number
将在继承链中正确解析。
这也意味着在基类中调用this.Member
,如果在派生类中重写,将再次使用继承链并找到派生的实现。
如果已被覆盖,则使用base
将总是转到该属性的基类版本,而this.Number
将首先转到您的被覆盖版本。
如果您打算在构建器内调用virtual
成员,请注意围绕它的一般建议:
Virtual member call in a constructor
这个答案省略了关于成员隐藏的解释,因为OP示例比这简单。
答案 1 :(得分:2)
在这种情况下,没有区别。如果你覆盖它将采用基类的值而不是继承的类:
public class Example {
public virtual int Number { get; set; }
public Example(int numberArg) {
this.Number = numberArg;
}
}
public class AnotherExample : Example {
public override int Number
{
get{return 5;}
set{}
}
public int DoubleNumber {
get {
return this.Number * 2; // returns 10
return base.Number * 2 // returns 2 times whatever the value is
}
}
public AnotherExample(int numberArg) : base(numberArg) {}
}
答案 2 :(得分:1)
您可以在派生类中使用与基类中具有相同名称的变量。在这种情况下,您需要使用this
和base
关键字以避免歧义。例如:
public class Base
{
public int Number = 0;
}
public class Derived : Base
{
public int Number;
public Derived()
{
this.Number = base.Number + 5;
}
}