最近在重新系统地学习C#,参照书籍《C#高级编程(第七版)》,在学习到继承部分意识到部分知识的缺失,如题编译看左边,运行看右边。
首先需要考虑这句话的使用范围,在编写如下代码“ClassBase classBase = new ClassBase();
ClassDerived classDerived = new ClassDerived();”的情况下,必定不会考虑“编译看左边,运行看右边”的说吧,因为左右两边都是同种类。
在代码实例中ClassBase classTest = new ClassDerived();此种情况下才有可能出现问题。
首先排除掉对static关键字的考虑。静态类只能从Object类进行继承并且静态字段/静态方法只能通过类进行调用而无法通过对象进行调用。
对于成员变量,不存在编译看左边,运行看右边一说,无论是编译还是运行,看的都是左边。
对于成员方法,只有基类存在的方法才能够调用,否则出现编译错误(输入.后无提示),在调用时则使用子类重写【基类中方法用virtual修饰、子类中方法用override修饰】的方法。
class ClassBase{
public string stringBase = "基类成员变量";
public virtual string MethodTest(){
return "基类测试方法";
}
}
class ClassDerived : ClassBase{
public string stringBase = "子类成员变量";
public override string MethodTest(){
return "子类测试方法";
}
}
public static void main(string[] args){
//以下两种语句必定不会考虑编译在左边,运行在右边
ClassBase classBase = new ClassBase();
ClassDerived classDerived = new ClassDerived();
//到了这里情况变得复杂一些
ClassBase classTest = new ClassDerived();
Console.WriteLine(classTest.stringBase);//基类成员变量
Console.WriteLine(classTest.MethodTest);//子类测试方法
}
//解释不周有疑问,欢迎留言讨论