继承和多态

本文深入讲解面向对象编程的三大特性:继承、封装、多态。重点解析继承与多态的概念及应用,通过具体代码示例介绍了new、virtual、override、sealed、abstract等关键字的作用与使用场景。

继承、封装、多态是面向对象的三大特性。这里主要理解一下继承和多态。继承可以理解为子类继承父类。

其中有几个词在继承和多态中经常用到:new、virtual、override、sealed、abstract

结合例子看一下这几个词的用法和说明:

1、new:我认为就是一个标记。目的就是为了避免冲突。父类中的方法和子类中的方法一模一样,子类的方法前加:new,来避免冲突。

代码:

 public class Parent
    {
        public Parent()
        {
            Console.WriteLine("父类构造");           
        }
        public void GaGa()
        {
            Console.WriteLine("父类的【GaGa】叫方法");
        }
        public virtual void Walk()
        {
            Console.WriteLine("父类走的动作");
        }
    }
    public class Children : Parent
    {
        public Children()
        {
            Console.WriteLine("子类的构造");            
        }
         new public void GaGa()
        {
            Console.WriteLine("子类方法GaGa与父类未公开继承的GaGa方法重叠,子类用new将父类方法隐藏。");
        }
        public override void Walk()
        {
            Console.WriteLine("子类走的动作");
        }
    }   
View Code

父类Parent中: 

public void GaGa()
{
      Console.WriteLine("父类的【GaGa】叫方法");
}


子类中同样有这样的方法:加入new方法

 new public void GaGa()
{
      Console.WriteLine("子类方法GaGa与父类未公开继承的GaGa方法重叠,子类用new将父类方法隐藏。");
}

那我们调用时这样写:

 class Program
    {
        static void Main(string[] args)
        {
            Parent p = new Children();
            //父类GaGa()方法
            p.GaGa();           
            Console.WriteLine("---------------------------------------");       
          
        }
    }

因为有new的区分父类和子类的方法(完全相同的方法),所以调用的是父类的GaGa方法。

执行结果截图:

分析执行结果:子类继承父类,实例化子类时,先构造父类构造,再构造子类构造,之后我们调用了子类中与父类相同方法的GaGa(),但是我们用new在子类方法前加以区分。

二、virtual  虚方法,也是一个标记,标记这个类中的方法可以在子类中重写覆盖(override)或者隐藏(new)

1、override

 public class Parent
    {
        public Parent()
        {
            Console.WriteLine("父类构造");           
        }
        public void GaGa()
        {
            Console.WriteLine("父类的【GaGa】叫方法");
        }
        public virtual void Walk()
        {
            Console.WriteLine("父类走的动作");
        }       
    }
    public class Children : Parent
    {
        public Children()
        {
            Console.WriteLine("子类的构造");            
        }
         new public void GaGa()
        {
            Console.WriteLine("子类方法GaGa与父类未公开继承的GaGa方法重叠,子类用new将父类方法隐藏。");
        }
        public override void Walk()
        {
            Console.WriteLine("子类走的动作,完全覆盖父类公开可以继承的此方法");
        }       
    }   

这里除了注意父类和子类的walk()方法的写法,还需注意:

  Parent p = new Children();
            //父类GaGa()方法
            p.GaGa();    ----------这个是子类用new方法加以区别父类的方法
            p.Walk();    ----------这个是子类用 override 重写覆盖父类方法

注意运行结果:

我们实例化的是子类,但是赋给了父类引用,而子类中正好Walk()方法覆盖了父类方法。这样调用的时候就是子类的Walk()

方法的实现。

(2)new

public class Parent
    {
        public Parent()
        {
            Console.WriteLine("父类构造");           
        }
        public void GaGa()
        {
            Console.WriteLine("父类的【GaGa】叫方法");
        }
        public virtual void Walk()
        {
            Console.WriteLine("父类走的动作");
        }       
    }
    public class Children : Parent
    {
        public Children()
        {
            Console.WriteLine("子类的构造");            
        }
         new public void GaGa()
        {
            Console.WriteLine("子类方法GaGa与父类未公开继承的GaGa方法重叠,子类用new将父类方法隐藏。");
        }
        new public  void Walk()-------------------------看这!!!!!!!!!
        {
            Console.WriteLine("子类走的动作,完全覆盖父类公开可以继承的此方法");
        }
       
    }   

区别于上面,父类Walk()标记为virtual 可以重写,现在的子类是用new也是区别于相同方法

调用结果:

对的,子类没有用override覆盖父类方法,所以调用的还是父类的那个自己的Walk()方法。

 

三、override:上面已经提到是在父类中用到virtual,子类就用override进行重写。

 

四、sealed密封的,密封类是不可以继承的。

 

五、abstract:抽象,抽象类中的抽象方法,继承了此类的子类必须重写抽象实现

 

总结:

关键字可以拥有此关键字的对象作用  
new子类与父类拥有相同方法的子类方法隐藏父类相同方法,这样子类和父类的方法相互独立,不会存在冲突  
virtual父类的方法父类的此方法可以让父类进行重写,子类可以根据实际情况决定是否重写。  
override子类对应重写父类的方法,用此标记。用于子类对父类标记virtual的方法的重写标记,这样就实实在在的覆盖了父类的那个可以允许子类重写的方法。记住是覆盖。  
abstract用于类和方法类--不可以实例化,方法--如果继承此类,就必须实现abstract方法。  
sealed表示,该类不可以继承  

 

 

转载于:https://www.cnblogs.com/sunchong/p/3495142.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化并行计算等改进策略。; 适合人群:具备一定Python编程基础优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值