面向对象编程就是面向抽象的父类进行编程,具体的实现不用考虑,由子类决定。<经典的说法--面向鸭子编程>

eg:鸭子的编程,<对于多态的理解>

我们都习惯把使用两条腿两边走的动物,形象的叫做鸭子。这里我们的本来的鸭子就是父类(抽象类),继承且实现方法的叫做子类,就是我们把走路和鸭子一样的都叫做鸭子一样。(木头鸭子,橡皮鸭子,真实的鸭子)。

接口:鸭子叫,鸭子游泳。

    //鸭子大叫
public interface IBark
{
void Bark();
}
    //鸭子游泳接口
public interface ISwitch
{
void Switch();//接口只管定义方法,不用管实现。
}

真实鸭子,木头鸭子,橡皮鸭子

    //真鸭子,即会游泳又回叫
public class RealDuck:Duck,IBark
{
public void Bark()
{
Console.WriteLine("嘎嘎嘎嘎嘎嘎嘎------");
} public override void Switch()
{
Console.WriteLine("真实的鸭子----自由自在的游泳.....");
}
}
    //橡皮鸭子,继承鸭子,只会叫。
public class RubbleDuck:Duck,IBark
{
public void Bark()
{
Console.WriteLine("叽叽叽叽....");
} public override void Switch()
{
Console.WriteLine("橡皮鸭子--,漂浮在水上。");
}
}
    //木头鸭子
public class WoodDuck:Duck
{
public override void Switch()
{
Console.WriteLine("木头鸭子,漂浮在水上。");
}
}

main()方法中的。

        /// <summary>
/// 面向鸭子编程----->理解多态
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//父类定义方法,子类具体实现(每个鸭子游泳是不一样的。)
Duck d1=new RealDuck();
Duck d2=new RubbleDuck();
Duck d3=new WoodDuck();
Console.WriteLine("……………01.鸭子游泳………...…");
//三个鸭子的游泳都不一样
d1.Switch();
d2.Switch();
d3.Switch();
Console.WriteLine("……………02.鸭子的叫声……………");
//把抽象类给了接口IBark,(利用了里氏转换原则)
IBark i1 = d1 as IBark;
if (i1!=null) i1.Bark(); //会叫,嘎嘎嘎嘎
IBark i2 = d2 as IBark;
if (i2!=null)
{
i2.Bark(); //会叫,叽叽
}
IBark i3 = d3 as IBark;
if (i3!=null)
{
i3.Bark(); //不会叫,没有实现ibark接口,而且木头鸭子本身就不会叫。
}
Console.ReadKey();
}
}

上面我们把鸭子Duck定义为抽象的类,里面我们只是定义了方法,具体的实现在子类中。就是我们前面说的那样,父类定义方法,子类继承实现,这就是具体的实现在子类,每个都是不一样的。

下面的那个利用里氏转换原理,把父类Duck转换为接口IBark,只要实现了接口,他就会拥有里面叫的方法。

30天C#基础巩固------面向鸭子编程,关于string和File的练习-LMLPHP

反转字符串

            //将字符串反转。
Console.WriteLine("请输入一个字符串?");
string input = Console.ReadLine();
char[] chs= input.ToCharArray(); //将string类型转换为数组
for (int i = 0; i <chs.Length/2; i++) //反转只需要执行1/2次数就可以。
{
char cTemp = chs[i];
chs[i] = chs[chs.Length-1-i]; //第一个和最后一个转换
chs[chs.Length - 1 - i] = cTemp;
}
Console.WriteLine(new string(chs)); //把char数组又转换为string类型。
Console.ReadKey();

30天C#基础巩固------面向鸭子编程,关于string和File的练习-LMLPHP

读取phone.csv文件并且输出来。

            string[] lines = File.ReadAllLines("phone.csv", Encoding.Default);       //按行读取Debug文件下面
//的csv文件,放到数组里面。
for (int i = 0; i < lines.Length; i++)
{
string[ ] ts = lines[i].Split(',');
Console.WriteLine("姓名:{0}",ts);
}
Console.ReadKey();

读取文件利用File.ReadAllLines(“文件名”,Encoding.Default);,这个是读取项目文件中Debug目录下的文件,按行读取值,放到string[]数组中.

30天C#基础巩固------面向鸭子编程,关于string和File的练习-LMLPHP

利用键值对来保存我们读取到字符串中的年月日下标。

            string src = "1993年10月08日";
Dictionary<char,int> dic=new Dictionary<char, int>(); //声明一个键值对。
int index = -1;
do
{
//显示这3个字符的位置下标。
index = src.IndexOfAny("年月日".ToCharArray(), index + 1); //将字符串"年月日"转换为char数组,循环的输出每个下标。
if (index!=-1)
{
//Console.WriteLine(index);
dic.Add(src[index],index);
}
} while (index!=-1);
//循环输出键值对中的值,注意这里的KeyValuePair<char, int>类型,不是我们以前的var。
foreach (KeyValuePair<char, int> item in dic)
{
Console.WriteLine(item.Key+" "+item.Value);
}
Console.ReadKey();

30天C#基础巩固------面向鸭子编程,关于string和File的练习-LMLPHP

05-08 08:38