34.函数重载
cs/* 函数重载 您可以在同一个范围内对相同的函数名有多个定义。 函数的定义必须彼此不同,可以是参数列表中的参数类型不同,也可以是参数个数不同。 不能重载只有返回类型不同的函数声明。 下面的实例演示了几个相同的函数 Add(),用于对不同个数参数进行相加处理: */ using System; namespace PolymorphismApplication { public class TestData { public int Add(int a, int b, int c) { return a + b + c; } public int Add(int a, int b) { return a + b; } } class Program { static void Main(string[] args) { TestData dataClass = new TestData(); int add1 = dataClass.Add(1, 2); int add2 = dataClass.Add(1, 2, 3); Console.WriteLine("add1 :" + add1); Console.WriteLine("add2 :" + add2); } } }
35.几个相同的函数 print(),用于打印不同的数据类型。
csusing System; namespace PolymorphismApplication { class Printdata { void print(int i) { Console.WriteLine("输出整型: {0}", i ); } void print(double f) { Console.WriteLine("输出浮点型: {0}" , f); } void print(string s) { Console.WriteLine("输出字符串: {0}", s); } static void Main(string[] args) { Printdata p = new Printdata(); // 调用 print 来打印整数 p.print(1); // 调用 print 来打印浮点数 p.print(1.23); // 调用 print 来打印字符串 p.print("Hello Runoob"); Console.ReadKey(); } } }
36.基类和派生类
csusing System; namespace InheritanceApplication { class Shape { public void setWidth(int w) { width = w; } public void setHeight(int h) { height = h; } protected int width; protected int height; } // 派生类 class Rectangle : Shape { public int getArea() { return (width * height); } } class RectangleTester { static void Main(string[] args) { Rectangle Rect = new Rectangle(); Rect.setWidth(5); Rect.setHeight(7); // 打印对象的面积 Console.WriteLine("总面积: {0}", Rect.getArea()); Console.ReadKey(); } } }
37.基类的初始化
csusing System; namespace RectangleApplication { class Rectangle { // 成员变量 protected double length; protected double width; public Rectangle(double l, double w) { length = l; width = w; } public double GetArea() { return length * width; } public void Display() { Console.WriteLine("长度: {0}", length); Console.WriteLine("宽度: {0}", width); Console.WriteLine("面积: {0}", GetArea()); } } //end class Rectangle class Tabletop : Rectangle { private double cost; public Tabletop(double l, double w) : base(l, w) { } public double GetCost() { double cost; cost = GetArea() * 70; return cost; } public void Display() { base.Display(); Console.WriteLine("成本: {0}", GetCost()); } } class ExecuteRectangle { static void Main(string[] args) { Tabletop t = new Tabletop(4.5, 7.5); t.Display(); Console.ReadLine(); } } }
38.多重继承
cs/* 如果一个类使用protected修饰符来声明一个成员, 那么只有在该类和其派生类中才能访问该成员。 */ using System; namespace InheritanceApplication { class Shape { public void setWidth(int w) { width = w; } public void setHeight(int h) { height = h; } protected int width; protected int height; } // 基类 PaintCost public interface PaintCost { int getCost(int area); } // 派生类 class Rectangle : Shape, PaintCost { public int getArea() { return (width * height); } public int getCost(int area) { return area * 70; } } class RectangleTester { static void Main(string[] args) { Rectangle Rect = new Rectangle(); int area; Rect.setWidth(5); Rect.setHeight(7); area = Rect.getArea(); // 打印对象的面积 Console.WriteLine("总面积: {0}", Rect.getArea()); Console.WriteLine("油漆总成本: ${0}" , Rect.getCost(area)); Console.ReadKey(); } } }
39.动态多态性
csusing System; namespace PolymorphismApplication { abstract class Shape { abstract public int area(); } class Rectangle: Shape { private int length; private int width; public Rectangle( int a=0, int b=0) { length = a; width = b; } public override int area () { Console.WriteLine("Rectangle 类的面积:"); return (width * length); } } class RectangleTester { static void Main(string[] args) { Rectangle r = new Rectangle(10, 7); double a = r.area(); Console.WriteLine("面积: {0}",a); Console.ReadKey(); } } }
40.抽象性和虚方法
csusing System; using System.Collections.Generic; public class Shape { public int X { get; private set; } public int Y { get; private set; } public int Height { get; set; } public int Width { get; set; } // 虚方法 public virtual void Draw() { Console.WriteLine("执行基类的画图任务"); } } class Circle : Shape { public override void Draw() { Console.WriteLine("画一个圆形"); base.Draw(); } } class Rectangle : Shape { public override void Draw() { Console.WriteLine("画一个长方形"); base.Draw(); } } class Triangle : Shape { public override void Draw() { Console.WriteLine("画一个三角形"); base.Draw(); } } class Program { static void Main(string[] args) { // 创建一个 List<Shape> 对象,并向该对象添加 Circle、Triangle 和 Rectangle var shapes = new List<Shape> { new Rectangle(), new Triangle(), new Circle() }; // 使用 foreach 循环对该列表的派生类进行循环访问,并对其中的每个 Shape 对象调用 Draw 方法 foreach (var shape in shapes) { shape.Draw(); } Console.WriteLine("按下任意键退出。"); Console.ReadKey(); } }
41.通过虚方法 area() 来计算不同形状图像的面积
cs/* *这是一个使用C#语言实现的面向对象编程(OOP)的例子, 主要展示了多态性(通过继承和重写)和封装(通过使用访问修饰符)。 分析代码: Shape 是一个基类,它有一个保护的成员变量 width 和 height(用于定义形状的宽度和高度), 以及一个带两个默认值为0的整型参数的构造函数。这个构造函数初始化 width 和 height。 Shape 类还定义了一个公共的虚方法 area(),该方法返回形状的面积。这个方法在子类中被重写。 Rectangle 和 Triangle 类都继承自 Shape 类,并重写了 area() 方法。 Rectangle 的面积是宽度乘以高度,而 Triangle 的面积是宽度乘以高度的一半。 Caller 类有一个方法 CallArea(),它接受一个 Shape 类型的参数,并调用该参数的 area() 方法。 Tester 类的 Main() 方法创建了一个 Caller 对象和一个 Rectangle 对象以及一个 Triangle 对象。 然后,它调用 Caller 对象的 CallArea() 方法两次,分别传入 Rectangle 和 Triangle 对象。 这两次调用都会打印出相应形状的面积。 所以,当你运行这个程序时,它会首先打印出 "父类的面积:", 然后打印出 "Rectangle 类的面积:" 和 "Triangle 类的面积:", 最后打印出这两个形状的面积。 */ using System; namespace PolymorphismApplication { class Shape { protected int width, height; public Shape( int a=0, int b=0) { //在这里实现基类的初始化代码 width = a; height = b; } public virtual int area() { Console.WriteLine("父类的面积:"); return 0; } } class Rectangle: Shape { public Rectangle( int a=0, int b=0): base(a, b) { //在这里实现Rectangle类的初始化代码 } public override int area () { Console.WriteLine("Rectangle 类的面积:"); return (width * height); } } class Triangle: Shape { public Triangle(int a = 0, int b = 0): base(a, b) { } public override int area() { Console.WriteLine("Triangle 类的面积:"); return (width * height / 2); } } class Caller { public void CallArea(Shape sh) { int a; a = sh.area(); Console.WriteLine("面积: {0}", a); } } class Tester { static void Main(string[] args) { Caller c = new Caller(); Rectangle r = new Rectangle(10, 7); Triangle t = new Triangle(10, 5); c.CallArea(r); c.CallArea(t); Console.ReadKey(); } } }
42.运算符重载的实现
cs/* 运算符重载的实现 */ using System; namespace OperatorOvlApplication { class Box { private double length; // 长度 private double breadth; // 宽度 private double height; // 高度 public double getVolume() { return length * breadth * height; } public void setLength( double len ) { length = len; } public void setBreadth( double bre ) { breadth = bre; } public void setHeight( double hei ) { height = hei; } // 重载 + 运算符来把两个 Box 对象相加 public static Box operator+ (Box b, Box c) { Box box = new Box(); box.length = b.length + c.length; box.breadth = b.breadth + c.breadth; box.height = b.height + c.height; return box; } } class Tester { static void Main(string[] args) { Box Box1 = new Box(); // 声明 Box1,类型为 Box Box Box2 = new Box(); // 声明 Box2,类型为 Box Box Box3 = new Box(); // 声明 Box3,类型为 Box double volume = 0.0; // 体积 // Box1 详述 Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0); // Box2 详述 Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0); // Box1 的体积 volume = Box1.getVolume(); Console.WriteLine("Box1 的体积: {0}", volume); // Box2 的体积 volume = Box2.getVolume(); Console.WriteLine("Box2 的体积: {0}", volume); // 把两个对象相加 Box3 = Box1 + Box2; // Box3 的体积 volume = Box3.getVolume(); Console.WriteLine("Box3 的体积: {0}", volume); Console.ReadKey(); } } }
@www.runoob.com