04_C#学习_面向对象

2019-03-07  本文已影响0人  乖薯宝

2019-03-07

面向对象编程

特点:封装,继承,多态(子类)
优点:易维护,易扩展,易开发
—— 与面向过程编程相对。

1. 继承

为什么要继承:不用写重复的代码
怎么实现继承:一个类派生于另一个基类,它拥有该基础类型的所有成员字段和函数。
理解:直接将基类里面的代码copy到派生类中
规则:单继承,只能继承一个父类。


语法:
class ChildClass : ParentClass
{...
}

2. 隐藏方法

派生类希望在从基类继承来的方法中,进行独特性的改变。

class Pet
    {
        public string Name;
        public void PrintName()
        {
            Console.WriteLine("Pet's name is:" + Name);
        }
    }
 class Dog:Pet
    {//new 方法;在派生类中进行了方法修改
        new public void PrintName()
        {
            Console.WriteLine("狗的名字是:" + Name);
        }
    }
//在Dog类实例化对象下,执行new方法
//在Pet类实例化对象,执行基类原来的方法

3. 虚方法和多态:virtual,override

  1. 设计原则:尽量依赖抽象类(Pet),而不依赖于具体类(Dog)

  2. 基类的引用:基类的引用,并指向派生类

Pet dog = new Dog();

dog能访问的内容是:Pet基类中正常部分+Pet基类中的虚方法在Dog派生类中override的重写对象。

  1. 提高效率:首先,我们希望能进行统一的管理,通过一个容器(数组)能保存所有对象(Dog,Cat),但是这些对象必须是同类型的。 所以,通过一个基类类型的数组储存所有对象,并通过虚方法和多态实现个性化。
Pet[] pets = new Pet[] { new Dog("Jack"), new Cat("Tom") };
  1. 虚方法和多态
    虚方法:声明为virtual的方法是虚方法。基类的虚方法可以在派生类中使用override进行重写
    多态:指向派生类的基类引用,调用虚函数时候,会调用派生类中的同名重写函数,便是多态。
//基类Pet
  class Pet{
        public string Name;
        public void PrintName()
        {
            Console.WriteLine("Pet's name is:" + Name);
        }
        virtual public void Speak()
        {
            Console.WriteLine(Name+" is speaking");
        }
    }
//子类Dog
 class Dog:Pet{
        public Dog(string name)
        {
            this.Name = name;
        }

        public override void Speak()
        {
            Console.WriteLine(Name + " is speaking:"+"wangwang");
        }
    }
//子类Cat
 class Cat:Pet {
        public Cat(string name)
        {
            Name = name;
        }
        public override void Speak()
        {
            Console.WriteLine(Name + " is speaking:"+"miaomiao");
        }
    }
//主程序
    class Program{
        static void Main(string[] args){
            Pet[] pets = new Pet[] { new Dog("Jack"), new Cat("Tom") };
            for (int i = 0; i < pets.Length; i++)
            {
                pets[i].PrintName();
                pets[i].Speak();
            }
        }
    }

4. 派生类及构造函数

  1. 调用顺序


  2. 指向派生类的基类引用,要用派生类的构造函数,派生类的构造函数通过public Dog(string name):base(name)引用调用基类的构造函数。

   class Pet{
        public Pet(string name)
        {
            _name = name;
        }
}
   class Dog:Pet{
        public Dog(string name):base(name)
        {
        }
}
  class Cat:Pet{
        public Cat(string name):base(name)
        {
        }
}

 Pet[] pets = new Pet[] { new Dog("Jack"), new Cat("Tom") };

5. 抽象方法和类 abstract

abstract class Pet
    {
        public Pet(string name)
        {
            _name = name;
        }
        abstract public void Speak();
 }

6. 密闭类和密闭方法

sealed public override void Speak()

7. 接口

接口笔记链接

interface ICatchMice
{
  void CatchMice(); //里面是空方法
}
-- 不能加任何访问修饰符,但默认是public
//定义接口
interface ICatchMice
    {
        void CatchMice();
    }
interface IClimbTree
    {
        void ClimbTree();
    }
//Cat类继承接口
class Cat:Pet,ICatchMice,IClimbTree
    {
        public Cat(string name):base(name)
        {
        }
        public void CatchMice()
        {
            Console.WriteLine("Catch Mice");
        }
        public void ClimbTree()
        {
            Console.WriteLine("Climb Tree");
        }
    }
 class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat("Tom2");
            cat.CatchMice(); //用对象调用方法
            IClimbTree climb = (IClimbTree)cat;
            climb.ClimbTree(); //用接口调用方法
            ICatchMice catchMice = (ICatchMice)cat;
            catchMice.CatchMice();
        }
    }

8. 结构与类

  1. 不同点
  1. 适用类型

9. 静态成员

 class Dog:Pet
    {
        static int Num;
        static Dog()  //静态构造函数初始化Num,仅能访问静态成员
        {
            Num = 0;
        }
        public Dog(string name):base(name)
        {
            ++Num;
        }
        static public void ShowNum()
        {
            Console.WriteLine("Dog's number is " + Num);
        }
    }
 class Program
    {
        static void Main(string[] args)
        {
           Dog dog = new Dog("Tim");
           Dog.ShowNum();  //通过类直接调用静态方法
         }
     }

10. 静态类

static class PetGuide
    {
        public static void HowToFeedDog(this Dog dog)
        {
            ...  
            Console.WriteLine("Play a vedio about how to feed a dog");
        }
    }
class Program
    {
        static void Main(string[] args)
        {
            Dog dog = new Dog("Tim");
            dog.HowToFeedDog();  //像自己的方法一样直接调用静态类的方法
         }
    }

11. 装箱和拆箱

int i = 3;
object oi = null;
oi = i;
int i = 3;
object oi = i;
int j = (int) oi;

12. 自定义转换

 static public implicit operator Cat(Dog dog)
        {
            return new Cat(dog._name);
        }
static public explicit operator Dog(Cat cat)
        {
            return new Dog(cat._name);
        }
   Dog dog = new Dog("Jack");
    dog.Speak();
    Cat cat = dog;
    cat.Speak();
    Dog dog2 = (Dog)cat;
    dog2.Speak();

13. 重载运算符

class Dog:Pet
    {...
 static public Dog operator +(Dog dog1,Dog dog2)
        {
            if ((dog1.Sex == (Sex)0 && dog2.Sex == (Sex)1) || (dog1.Sex == (Sex)1 &&dog2.Sex == (Sex)0) )
            {
                return new Dog(dog1._name + dog2._name, Sex.female);
            }
            else
            {
                Console.WriteLine("Can't bath new baby");
                return null;
            }
        }
    }

            Dog dog1 = new Dog("Jack", Sex.male);
            Dog dog2 = new Dog("Mary", Sex.female);
            Dog littedog = dog1 + dog2;  //运算符重载
            littedog.ShowSex();
上一篇 下一篇

猜你喜欢

热点阅读