C# 继承的成员
2018-01-16 03:48 更新
C#继承的成员
隐藏继承的成员
基类和子类可以定义相同的成员。例如:
public class A {
public int Counter = 1;
}
public class B : A {
public int Counter = 2;
}
类B中的计数器字段被称为隐藏类A中的计数器字段。
要有意隐藏成员,在这种情况下,您可以将新修饰符应用于子类中的成员。
new
修饰符没有什么比压制编译器警告,否则会导致:
public class A {
public int Counter = 1;
}
public class B : A {
public new int Counter = 2;
}
new
修饰符告诉编译器重复的成员不是意外。
new和重写
考虑下面的类层次结构:
public class BaseClass {
public virtual void Foo() { Console.WriteLine ("BaseClass.Foo"); }
}
public class Overrider : BaseClass {
public override void Foo() { Console.WriteLine ("Overrider.Foo"); }
}
public class Hider : BaseClass {
public new void Foo() { Console.WriteLine ("Hider.Foo"); }
}
Overrider和Hider之间的行为差异在下面的代码中演示:
Overrider over = new Overrider();
BaseClass b1 = over;
over.Foo(); // Overrider.Foo
b1.Foo(); // Overrider.Foo
Hider h = new Hider();
BaseClass b2 = h;
h.Foo(); // Hider.Foo
b2.Foo(); // BaseClass.Foo
封装函数和类
被覆盖的功能成员可以用封装的关键字来封装其实现,以防止被覆盖。
public sealed override decimal FinalPrice {
get {
return Price;
}
}
你还可以封装类本身,隐式地封装所有的虚函数,通过应用封装修饰符到类本身。
基本关键字
base关键字与this关键字类似。
它有两个基本用途:
- 从子类访问重写的函数成员
- 调用基类构造函数
public class DiscountProduct : Item {
...
public override decimal FinalPrice {
get {
return base.FinalPrice + Price;
}
}
}
使用base关键字,我们无条件地访问Item的FinalPrice属性。
构造函数和继承
子类必须声明自己的构造函数。
基类的构造函数可以被派生类访问,但不会自动继承。
例如,如果我们定义基本类和子类如下:
public class Baseclass {
public int X;
public Baseclass () { }
public Baseclass (int x) { this.X = x; }
}
public class Subclass : Baseclass { }
以下是非法的:
Subclass s = new Subclass (123);
子类必须重新定义它想要公开的任何构造函数。
通过这样做,它可以使用base关键字调用任何基类的构造函数:
public class Subclass : Baseclass {
public Subclass (int x) : base (x) { }
}
base关键字的工作原理类似于this关键字,除了它调用基类中的构造函数。
如果子类中的构造函数忽略了base关键字,则基类型的无参构造器被隐式调用:
public class BaseClass { public int X; public BaseClass() { X = 1; } } public class Subclass : BaseClass { public Subclass() { Console.WriteLine (X); } // 1 }
如果基类没有可访问的无参数构造函数,则子类必须在其构造函数中使用base关键字。
以上内容是否对您有帮助:
← C# 抽象类
更多建议: