C#是一种面向对象的编程语言,它支持多继承,即一个子类可以从多个基类中继承属性和方法。多继承可以使子类具有多个基类的特性,从而更好地实现代码重用。
C#中的多继承是通过“:”来实现的,例如:
public class ChildClass : BaseClass1, BaseClass2 { // 子类代码 }
上面的代码表明ChildClass是BaseClass1和BaseClass2的子类,它将从这两个基类中获得特性。
C#中的多态也可以用于实施多态。例如,我们可以使用多态来创建一个函数,该函数可以接受不同子类的对象作为参数并返回不同子类的对象作为返回值。
public class BaseClass { public virtual BaseClass DoSomething(BaseClass obj) { // 实施逻辑 return obj; } } public class ChildClass : BaseClass { public override BaseClass DoSomething(BaseClass obj) { // 实施逻辑 return obj; } }
上面的代码表明DoSomething函数可以接受不同子类的对象作为参数并返回不同子
类可以从另一个类继承以扩展或定制原始类。
继承一个类会重用该类中的功能。
类只能从一个类继承。
在这个例子中,我们首先定义一个名为Item的类:
public class Item {
public string Name;
}
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);
多态性工作,因为子类具有其基类的所有功能。
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:
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关键字调用其基类实现。
C# 匿名类型匿名类型是由编译器在运行时创建的一个类,用于存储一组值。要创建匿名类型,请使用 new 关键字,后跟对象初始值设定...
C# 动态绑定动态绑定会将类型,成员和操作的解析过程从编译时延迟到运行时。使用上下文关键字 dynamic 声明动态类型:dynamic d =...
C# XML文档文档注释是用于记录类型或成员的嵌入式XML。文档注释紧接在类型或成员声明之前,并以三个斜杠开头:/// summaryCancel...
C# 交错数组 C# 数组交错数组是数组的数组。您可以声明一个带有 int 值的交错数组 scores,如下所示:int [][] scores;声明一个...