标签:自己 inf ons 新版本 htm 出现 实现 oss ima
class Shape
{
public double Area { get; set; }
public string Color { get; set; }
//使用virtual表明 该函数成员的功能希望在子类中被更新
public virtual void ShowInfo()
{
Console.WriteLine($"面积:{this.Area},颜色:{this.Color}");
}
}
class Square : Shape
{
//通过override,告诉父类,我升级了ShowInfo的功能
public override void ShowInfo()
{
Console.WriteLine("我有用四条边,且对边相等。。。。");
}
}
在Program类的Main函数中测试
class Program
{
static void Main(string[] args)
{
Square square = new Square();
square.ShowInfo();
Console.ReadLine();
}
}
/*输出:我有用四条边,且对边相等。。。。*/
class Square : Shape
{
public void ShowInfo()
{
Console.WriteLine("我有用四条边,且对边相等。。。。");
}
}
static void Main(string[] args)
{
Square square = new Square();
var result = square is Object;//Object是所有类型的基类型,所以is表达式结果为true
if (result)
{
Object o = (Object)square;//(Object)变灰,表明square可以隐式转换成Object类型引用
Console.WriteLine(o.GetType().BaseType.FullName);
}
Console.ReadLine();
}
/*输出:ExtendsDemo.Shape*/
从示例中,我们可以得到下面结论,如果两个类型之间存在继承关系,那么is表达式结果为true,则子类引用可以隐式转换成父类型引用
namespace ExtendsDemo
{
class Program
{
static void Main(string[] args)
{
Square square = new Square();
Shape shape = square;
shape.ShowInfo();
Console.ReadLine();
}
}
class Shape
{
public double Area { get; set; }
public string Color { get; set; }
//使用virtual表明 该函数成员的功能希望在子类中被更新
public virtual void ShowInfo()
{
Console.WriteLine($"面积:{this.Area},颜色:{this.Color}");
}
}
class Square : Shape
{
public override void ShowInfo()
{
Console.WriteLine("我有用四条边,且对边相等。。。。");
}
}
}
/*输出结果:我有用四条边,且对边相等。。。。*/
是否很有意思,一个Shape类型的变量,从我们第一直觉上判断,应该输出的是Shape类型的ShowInfo函数中的输出信息,但是结果却并非如此。这就是多态特殊之处。
class Square : Shape
{
public new void ShowInfo()
{
Console.WriteLine("我有用四条边,且对边相等。。。。");
}
}
/*输出:面积:0,颜色:*/
从输出结果可以看出,使用new修饰后的ShowInfo函数,不会被父类型引用调用到,而是调用了父类中原有的函数成员;本来我们将代码写成父类型变量=子类型对象的形式,就是为了使用多态,这样一来不就是破坏了多态性么?
namespace ExtendsDemo
{
class Program
{
static void Main(string[] args)
{
var zhengfangxing = new ZhengFangXing();
Shape shape = zhengfangxing;
shape.ShowInfo();
Console.ReadLine();
}
}
class Shape
{
public double Area { get; set; }
public string Color { get; set; }
//使用virtual表明 该函数成员的功能希望在子类中被更新
public virtual void ShowInfo()
{
Console.WriteLine($"面积:{this.Area},颜色:{this.Color}");
}
}
class Square : Shape
{
public override void ShowInfo()
{
Console.WriteLine("我有用四条边,且对边相等。。。。");
}
}
class ZhengFangXing:Square
{
public override void ShowInfo()
{
Console.WriteLine("我是特殊的长方形。。。我叫正方形");
}
}
}
/*输出:我是特殊的长方形。。。我叫正方形*/
从Shape到Squre再到ZhengFanxing总共经历了两次重写(我称它叫版本升级),那么Shape类型的变量访问的到继承链上的最新版本,就是ZhengFangXing的ShowInfo()
namespace ExtendsDemo
{
class Program
{
static void Main(string[] args)
{
var zhengfangxing = new ZhengFangXing();
Shape shape = zhengfangxing;
shape.ShowInfo();
Console.ReadLine();
}
}
class Shape
{
public double Area { get; set; }
public string Color { get; set; }
//使用virtual表明 该函数成员的功能希望在子类中被更新
public virtual void ShowInfo()
{
Console.WriteLine($"面积:{this.Area},颜色:{this.Color}");
}
}
class Square : Shape
{
public new virtual void ShowInfo()
{
Console.WriteLine("我有用四条边,且对边相等。。。。");
}
}
class ZhengFangXing:Square
{
public override void ShowInfo()
{
Console.WriteLine("我是特殊的长方形。。。我叫正方形");
}
}
}
/*输出:面积:0,颜色:*/
不知道你是否猜对?没关系,我们分析一下原因:在例子2中我们说过,new并不是一种重写形式,我更愿意把它当作是一种新成员(横向扩展),它不会带来版本更新;从基类出发顺着继承链,向下找到最新版本的重写;在new出现的那一层,基类发现则并不是一种重写(即没有最新版本),所以基类型引用就调用了自己的函数成员。
namespace ExtendsDemo
{
class Program
{
static void Main(string[] args)
{
Shape square = new Square();
Shape circle = new Circle();
Shape trangle = new Trangle();
square.ShowInfo();
circle.ShowInfo();
trangle.ShowInfo();
Console.ReadLine();
}
}
class Shape
{
public double Area { get; set; }
public string Color { get; set; }
//使用virtual表明 该函数成员的功能希望在子类中被更新
public virtual void ShowInfo()
{
//既然每个子类都要升级该函数的功能,那就干脆不写任何功能代码了
}
}
class Square : Shape
{
public override void ShowInfo()
{
Console.WriteLine("我有用四条边,且对边相等。。。。");
}
}
class Circle : Shape
{
public override void ShowInfo()
{
Console.WriteLine("我圆形,我特圆....");
}
}
class Trangle : Shape
{
public override void ShowInfo()
{
Console.WriteLine("我是三角形,我具有稳定性....");
}
}
}
/*输出:
我有用四条边,且对边相等。。。。
我圆形,我特圆....
我是三角形,我具有稳定性....
*/
上面代码演示了,多态的使用;需要注意的是,在基类中ShowInfo方法中的一段注释;这段注释是为了引出抽象类:因为声明了一个virtual函数,而这个函数里面却什么也没做,这看起来是不是很奇怪?下篇文章我将记录专为做基类而生的"抽象类",它就能很好地解决目前我们遇到的"没有功能代码的空函数"的问题。
以上是对基于继承的重写和多态的总结,记录下来以便以后查阅。
标签:自己 inf ons 新版本 htm 出现 实现 oss ima
原文地址:https://www.cnblogs.com/bigbosscyb/p/13875645.html