我是一个刚开始学习接触面向对象编程的学生,学了c#大概有几天,目前学到继承多态有个疑问。既然在向上转型(子类转为父类)时,变量的静态类型已经变成了父类,理论上就应该严格限制只能访问父类自身定义的成员,按照这种思路,子类新增的字段和功能在向上转型后,不应该再被访问到(这是我粗浅理解),然而,由于子类overide了父类的virtual属性,导致即使通过父类引用访问,看似访问的是重写后的版本,但是却间接操作了父类类型里本不应该有的成员(基类vehicle被改写后的属性其实是在操作自己派生类car类独有的私有字段_rpm) ,所以这种间接操作是否破坏了封装性?亦或者我对面向对象编程的理解上出现了问题?
using System.Buffers;
using System.Runtime.CompilerServices;
using System.Security.Cryptography.X509Certificates;
namespace OOP;
class Program
{
static void Main(string[] args)
{
Vehicle car = new Car();
car.Accelarate();//实际上间接操作的是子类的私有字段,站在vehicle类的角度看,这个字段不该存在啊.
System.Console.WriteLine(car.Speed);//虽然是Vehicle类的属性,但实际上读取的也是子类私有字段,输出12.
}
}
class Vehicle
{
private int _speed;//基类speed字段
public virtual int Speed { get { return _speed; } set { _speed = value; } }
public virtual void Accelerate()//父类虚方法
{
Speed += 10;
}
}
class Car : Vehicle
{
public int _rpm;//子类独有的_rpm字段
public override int Speed { get { return _rpm / 80; } set { _rpm = value; } }
public override void Accelerate()//改写父类方法
{
_rpm += _rpm + 1000;
}
}