C# 继承

2018-01-22 17:06 更新

C# 继承

类可以从另一个类继承以扩展或定制原始类。

继承一个类会重用该类中的功能。

类只能从一个类继承。

例子

在这个例子中,我们首先定义一个名为Item的类:


public class Item {
   public string Name; 
} 

接下来,我们定义称为Product和DiscountProduct的类,它将从Item继承。产品和DiscountProduct获得项目的一切,加上他们定义的任何额外的成员:


public class Product : Item{ // inherits from Item 

    public long InStoreCount; 
} 
public class DiscountProduct : Item{  // inherits from Item 

    public decimal Price; 
} 

下面是我们如何使用这些类:


Product myProduct = new Product {Name="CSS",InStoreCount=1000}; 

Console.WriteLine (myProduct.Name); // CSS 
Console.WriteLine (myProduct.InStoreCount); // 1000 

以下代码使用DiscountProduct类。


DiscountProduct mansion = new DiscountProduct { Name="SQL", Price=250000 }; 
Console.WriteLine (mansion.Name);     // SQL 
Console.WriteLine (mansion.Price); // 250000 

注意

派生类Product和DiscountProduct从基类Item继承Name属性。

派生类也称为子类。基类也称为超类。

多态性

引用是多态的。

这意味着类型x的变量可以引用子类化x的对象。

例如,考虑以下方法:


public static void Display (Item i) { 
    System.Console.WriteLine (i.Name); 
} 

此方法可以显示Product和DiscountProduct,因为它们都是Items:


Product myProduct = new Product ... ; 
DiscountProduct mansion = new DiscountProduct ... ; 
Display (myProduct); 
Display (mansion); 

多态性工作,因为子类具有其基类的所有功能。

is 运算符


The <code>is</code> operator tests whether an 
object derives from a specified class or implements an interface. 

It is often used to test before downcasting. 

if (a is Product) {
   Console.WriteLine (((Product)a).InStoreCount); 
}

virtual 函数成员

标记为virtual的函数可以被希望提供特殊实现的子类覆盖。

方法,属性,索引器和事件都可以声明为virtual:


public class Item {
   public string Name;
   public virtual decimal FinalPrice { get { return 0; } } 
} 

子类通过应用覆盖修饰符覆盖虚拟方法:


public class Product : Item {
    public long InStoreCount; 
} 
public class DiscountProduct : Item {
    public decimal Price;
    public override decimal FinalPrice { 
       get { 
          return Price; 
       } 
    } 
} 

默认情况下,项目的FinalPrice为0。

Product不需要专门化此行为。

但是,DiscountProduct专门处理FinalPrice属性以返回价格的值:


DiscountProduct mansion = new DiscountProduct { Name="SQL", Price=250000 }; 
Item a = mansion; 
Console.WriteLine (mansion.FinalPrice); // 250000 
Console.WriteLine (a.FinalPrice); // 250000 

虚拟和重写方法的签名,返回类型和可访问性必须相同。

重写的方法可以通过base关键字调用其基类实现。

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

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号