定义Animal为父类,Dog为Animal的子类
那么下面有三种情况
Dog dog=new Dog();
Animal animal=new Animal();
Animal abc=new Dog();
那么这三者之间有什么差异?
abc在这里等同与dog还是animal?
或者是加强版的animal还是阉割版的dog?
他的权限跟dog相同还是animal相同?
那么下面有三种情况
Dog dog=new Dog();
Animal animal=new Animal();
Animal abc=new Dog();
那么这三者之间有什么差异?
abc在这里等同与dog还是animal?
或者是加强版的animal还是阉割版的dog?
他的权限跟dog相同还是animal相同?
三者的差异
animal 是父类.abc等同于dog,理论上说父类与子类的关系, 子类可以替换父类.就是当使用animal这个对象的时候, 它的方法, 属性可以被dog或者abc子类的方法,属性来代替.
换句话说 dog跟abc 是animal的加强版.
2Dog dog=new Dog(); //这个自然可以
3Animal abc=new Dog(); //这个也访问不到Dog中的Public属性你动手写一下这几个类,你就明白的很
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication35
{
class Animal
{
public int i = 0;
int j = 0;
}
}using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication35
{
class Dog:Animal
{
public int k= 9; public string ReturName()
{
return "你好";
}
}
}using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication35
{
class Program
{
static void Main(string[] args)
{
Animal al = new Dog();
Animal a = new Animal();
Dog dog = new Dog();
}
}
}
我给你写好好算了,你去调用一下就知道了
{
public abstract class Animal
{
public abstract void ShowType();
public void Eat()
{
Console.WriteLine("Animal always eat.");
}
} public class Bird:Animal
{
private string type = "Bird";
public override void ShowType()
{
Console.WriteLine("Type is {0},Bird类的调用",type);
}
private string color;
public string Color
{
get { return color; }
set { color = value; }
}
} public class Chicken : Bird
{
private string type = "Chicken";
public override void ShowType()
{
Console.WriteLine("Type is {0},Chicken类的调用",type);
}
}
}
这个是我写的,如果我把Chicken的override去掉的话那么输出的是Bird,否则的话是Chicken!
个人感觉这里的abc应该是加强版的Animal,而不是阉割版的Dog,毕竟abc是Animal类型的,不知道对不对,还有就是权限的问题,这里的abc的权限跟谁的有关?
Animal a = new Animal();这两个表面上看不一样,其实差不多,根本访问不到Dog中的东西
Dog dog = new Dog();这个是最终版,上可访问父类,下可访问自己
dog类是在animal类继承的. 也就是说, 功能要比父类多,所以abc对象是animal对象的加强版. 如此是否清楚一点?
Dog abc = new Dog();这两条语句是等价的LZ明白否?
如果使用new隐藏基类虚方法时(加vitual就是虚方法),这个对象调用被隐藏的方法时,结果只执行基类方法;
如果使用override重载基类非虚方法时,调用被重载的方法,基类和派生类中的方法都执行。
非虚方法只能重载,虚方法只能隐藏。
这两者绝对不是等价的,我已经代码验证过了,子类中的一些方法父类怎么可能调用?
比如Animal里定义一个Eat()的方法
Dog继承并重写,然后重新定义一个Color()
那么Animal abc=new Dog();
这时的abc.Eat()是有的,并且跟Dog重写后的一样
但是abc.Cololr()是不存在的
对的,但如果父类的方法在子类被重写,a1就按照子类的方法进行构造,所以说a1是a的加强版