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关键字。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号