【推荐】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();
}
}
}
代码虽然简单,但诠释了面向对象语言的精髓。类是对万物的一个抽象认知,对象则是对类的详细阐述。类已经很抽象了,有没有比类还抽象的呢?
来源:oschina
链接:https://my.oschina.net/stupidpotato/blog/3154024