zoukankan      html  css  js  c++  java
  • 【c# 学习笔记】面向对象编程的应用

      在平时的开发过程中,面向对象编程的应用肯定必不可少。但前面的内容只是单独介绍了类、面向对象思想和接口,那么我们怎么在平时工作中来应用他们来实现面向对象编程呢?

      如果你想设计一个Dog类,有了类的概念后,你可能会响下面这样去实现它:

      

        public class Dog
        {
            public void EatFood()
            {
                //eat some food
            }
    
            public void Walk()
            {
    
            }
        }

      但是Dog类中的EatFood和Walk方法有可能被其他类用到,他们都是动物的共同特性。此时你应该考虑使用面向对象中的继承思想,重新设计代码。

      使用继承后的代码如下。其中添加了Animal类来封装公有的EatFood方法和Walk方法,这使得其他继承于Animal的子类都可以使用这两种方法,因此更好地重用了代码。

      

        public abstract class Animal
        {
            public void EatFood()
            {
                //eat some food
            }
    
            public void Walk()
            {
    
            }
        }
        public  class Dog:Animal
        {
          
        }

      如上,使用继承达到了重用代码的效果,但是不能过度使用继承,否则将导致派生类的膨胀,从而增加维护和管理的成本。如果必须过度使用,可以考虑通过接口来实现。

      1.解决方案一

        此时很容易想到在Animal类的定义中添加一个Show方法。

        public abstract class Animal
        {
            public void EatFood()
            {
                //eat some food
            }
    
            public void Walk()
            {
    
            }
    
            public void Show()
            {
    
            }
        }
        public  class Dog:Animal
        {
          
        }

      然而这种设计会把Animal概念本身固有的行为方法和另外一个特殊概念的“表演节目”的行为方法混在一起。并不是所有的Dog都具有表演节目的行为方法,而上面的设计会导致所有继承于Animal的动物都获得了表演节目的行为,这显然不符合现实情况,方案一不可取。

      

      2.解决方案二

      既然EatFood、Walk和Show方法属于两个不同的概念,所有应该把他们分别定义在代表这两个概念的类中。定义方式有3种:定义两个抽象类;一个概念使用抽象类,另一个使用Interface方式定义;两个概念都使用interface来定义。

      显然,因为C#语言不支持多重继承,两个概念都使用抽象类来实现是不可行的。而若两个概念都使用interface定义的话,从程序角度来说并没有什么问题,但从现实角度考虑,则显然不合理,因为Dog本身属于Animal,这并非接口所表达的CAN-Do的关系。

      所所以正确的设计应该是一个概念使用抽象类,另一个使用interface方法定义:两个概念都使用interface来定义。

      显然,因为c#语言不支持多重继承,两个概念都使用抽象类来实现是不可行的。而若两个概念都使用interface定义的话,从程序角度来说并没有什么问题,但从现实角度考虑,则显然不合理,因为Dog本身属于Animal,这并非接口所表达的CAN-DO的关系。

      所以正确的设计应该是一个概念使用抽象类,另一个使用interface。如下:

        public abstract class Animal
        {
            public void EatFood()
            {
                //eat some food
            }
    
            public void Walk()
            {
    
            }
    
        }
    
        public interface IAnimalShow
        {
            void Show();
        }
        public  class Dog:Animal
        {
          
        }
    
        public class SpecialDog:Animal,IAnimalShow
        {
            public void Show()
            {
    
            }
        }

      

  • 相关阅读:
    HDU 5569 matrix
    HDU 2795 Billboard
    HDU 1394 Minimum Inversion Number
    HDU 1754 I Hate It
    HDU 1166 敌兵布阵
    FOJ 2206 函数求解
    hihoCoder 1252 Kejin Game
    hihoCoder 1257 Snake Carpet(很简单的构造方法)
    2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)
    HDU 2485 Destroying the bus stations
  • 原文地址:https://www.cnblogs.com/xiaoyehack/p/9474196.html
Copyright © 2011-2022 走看看