C#-类

隐身守侯 提交于 2020-01-07 11:46:43

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

C#是完全面向对象编程的语言,类是组成程序的基础,C#类主要有字段和方法构成,字段用于表示特征变量,方法是对象可执行的操作与行为。面向对象的三大特征为

1.封装

对象的封装对于面向对象语言是极其重要的,我们在使用时无需过多关注内在细节,直接使用即可。举个简单的例子,电视机的使用,我们无需理会电视里面的各种电路,按下遥控器的各种按钮便可操控电视机。

2.继承

C# 语言中继承关系主要体现在类之间的继承,这样既能减少开发时的代码量又方便了程序的复用。

问题:使用继承的一般原则?

对于超类A和子类B,必需满足:命题“B是一个由A扮演的角色”不成立。B永远不需要转型成为其他某些类别中的对象。B扩展而不是覆盖或废弃A的行为(即Liskov原则)。A不仅仅是一个工具类(一些可以重用的实用功能)。对于一个问题域(特定的业务对象环境):A和B定义了同一类型的对象,或者是用户事务、角色、实体(团体、位置或其他东西),或其他物体的相似类别。否则,改用关联关系可能更加稳固、正确。-- Java Design

3.多态

在 C# 中,每个类型都是多态的,因为包括用户定义类型在内的所有类型都继承自 Object。多态就是同一个接口,使用不同的实例而执行不同操作。 把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。 提升了程序的扩展性与维护性。

以上是基本知识,下面我们从基础开始:

定义一个类

using System;

namespace Jerry
{
    class Animal
    {
        public string name;
        public int age;

        public void Eat()
        {
            Console.WriteLine("在吃饭");
        }

        public void Sleep()
        {
            Console.WriteLine("在睡觉");
        }
    }
}

我们抽象出一个动物类,name,age是动物的属性,Eat()与Sleep()是动物的行为。我们如何访问这个类呢?

class Program
    {
        static void Main(string[] args)
        {
            Animal animal = new Animal();
            animal.name = "猫";
            animal.age = 1;

            Console.WriteLine("动物的名字:"+ animal.name);
            Console.WriteLine("动物的年龄:" + animal.age);
            animal.Eat();
            animal.Sleep();
        }
    }

一般情况下,我们需要初始化这个类,怎么理解呢?女娲造人的故事大家都听过,我们把自己想象成女娲,创造“人类”。

Animal animal = new Animal();创造了一个对象,这个对象的别名叫animal;

animal.name = "猫";animal.age = 1;我们赋予这个动物叫做猫,她刚刚出生才1岁;

animal.Eat();animal.Sleep();我们命令她吃饭,睡觉,恩是不是很简单呢?

问题:1.动物真的非常多啊?猫,狗,猪,鸟,等等。。。如果我们每个类都定义name,age属性,Eat(),Sleep()函数,是不是有点画蛇添足?我们能不能把Animal作为一份模板使用呢?继承的优势便体现出来了。

using System;

namespace Jerry
{
    class Animal
    {
        public string name;
        public int age;

        public void Eat()
        {
            Console.WriteLine(name + "在吃饭");
        }

        public void Sleep()
        {
            Console.WriteLine(name + "在睡觉");
        }
    }

    class Cat : Animal
    { 
    
    }

    class Dog : Animal
    { 
    
    }


    class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            cat.name = "狸花猫";
            cat.age = 1;
            cat.Eat();
            cat.Sleep();

            Dog dog = new Dog();
            dog.name = "旺财";
            dog.age = 2;
            cat.Eat();
            cat.Sleep();
        }
    }
}

一只一岁的狸花猫吃了睡了,一只2岁的旺财吃了睡了,场面真的太美,甚是羡慕。:在这里表示的意思是继承,所有的共有字段与方法,都会被“复制”下来,Cat与Dog类里可是空空如也。此段代码看似美好,但是细想,狗与猫的吃饭与睡觉都是调用Animal的方法,总与世界不太符合,虽然动物都应该有吃饭与睡觉的行为,但是行为本身还是有区别的。代码如下:

using System;

namespace Jerry
{
    class Animal
    {
        public string name;
        public int age;

        public void Eat()
        {
            Console.WriteLine(name + "在吃饭");
        }

        public void Sleep()
        {
            Console.WriteLine(name + "在睡觉");
        }
    }

    class Dog : Animal
    {
        public void Eat()
        {
            Console.WriteLine("吃骨头");
        }

        public void Sleep()
        {
            Console.WriteLine("在床肚睡觉");
        }
    }

    class Cat : Animal
    {
        public void Eat()
        {
            Console.WriteLine("吃鱼");
        }

        public void Sleep()
        {
            Console.WriteLine("在床上睡觉");
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            cat.name = "狸花猫";
            cat.age = 1;
            cat.Eat();
            cat.Sleep();

            Dog dog = new Dog();
            dog.name = "旺财";
            dog.age = 2;
            cat.Eat();
            cat.Sleep();
        }
    }
}

代码运行结果是对的,不过实质却有点偏离了味道。我们代码改一下:

using System;

namespace Jerry
{
    class Animal
    {
        public string name;
        public int age;

        public void Eat()
        {
            Console.WriteLine(name + "在吃饭");
        }

        public void Sleep()
        {
            Console.WriteLine(name + "在睡觉");
        }
    }

    class Dog : Animal
    {
        public void Eat()
        {
            Console.WriteLine("吃骨头");
        }

        public void Sleep()
        {
            Console.WriteLine("在床肚睡觉");
        }
    }

    class Cat : Animal
    {
        public void Eat()
        {
            Console.WriteLine("吃鱼");
        }

        public void Sleep()
        {
            Console.WriteLine("在床上睡觉");
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            Animal cat = new Cat();
            cat.name = "狸花猫";
            cat.age = 1;
            cat.Eat();
            cat.Sleep();

            Animal dog = new Dog();
            dog.name = "旺财";
            dog.age = 2;
            dog.Eat();
            dog.Sleep();
        }
    }
}

这次想把猫和狗都作为Animal看待,事实也确实如此,Animal cat = new Cat();可是得出的结论却调用了Aniaml的方法,并非Cat的方法。说明Cat的方法没有将Animal的方法给“覆写”了。使用virtural关键字使父类函数“虚化”,子类中使用"override""覆写"。

using System;

namespace Jerry
{
    class Animal
    {
        public string name;
        public int age;

        public virtual void Eat()
        {
            Console.WriteLine(name + "在吃饭");
        }

        public virtual void Sleep()
        {
            Console.WriteLine(name + "在睡觉");
        }
    }

    class Dog : Animal
    {
        public override void Eat()
        {
            Console.WriteLine("吃骨头");
        }

        public override void Sleep()
        {
            Console.WriteLine("在床肚睡觉");
        }
    }

    class Cat : Animal
    {
        public override void Eat()
        {
            Console.WriteLine("吃鱼");
        }

        public override void Sleep()
        {
            Console.WriteLine("在床上睡觉");
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            Animal cat = new Cat();
            cat.name = "狸花猫";
            cat.age = 1;
            cat.Eat();
            cat.Sleep();

            Animal dog = new Dog();
            dog.name = "旺财";
            dog.age = 2;
            dog.Eat();
            dog.Sleep();
        }
    }
}

代码虽然简单,但诠释了面向对象语言的精髓。类是对万物的一个抽象认知,对象则是对类的详细阐述。类已经很抽象了,有没有比类还抽象的呢?

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!