抽象类不能被实例化,但是可以通过抽象类的子类来创建对象并调用方法。在这个例子中,Animal类是一个抽象类,它的子类Horse和Sheep都实现了Voice方法,因此可以通过Horse和Sheep类的实例来调用Voice方法。
具体来说,在Main方法中,先创建了一个Animal类型的horse对象,并将其赋值为Horse类的实例。然后给horse对象的Age属性赋值为10。接着调用horse对象的Voice方法,由于horse对象是Horse类的实例,因此会调用Horse类中覆盖了基类Animal中的Voice方法。在Horse类的Voice方法中,先调用了基类Animal中的Voice方法,然后输出"sisi"。
同样地,创建了一个Animal类型的sheep对象,并将其赋值为Sheep类的实例。然后调用sheep对象的Voice方法,由于sheep对象是Sheep类的实例,因此会调用Sheep类中覆盖了基类Animal中的Voice方法。在Sheep类的Voice方法中,先调用了基类Animal中的Voice方法,然后输出"mimi"。
因此,抽象类的作用在于定义了一些通用的方法或属性,而具体的实现则交给其子类来完成。通过抽象类,可以实现代码的复用和扩展。