C#接口--C#基礎
阿新 • • 發佈:2017-09-12
都是 program 分享 屬於 新增 eric 相關 修飾 pri 2)不能有字段:public string _name;是錯的【首先修飾符不能加,默認是public,string _name違反了不能有字段】
using System;
namespace 接口
}
using System;
namespace 接口
namespace 接口實現
namespace 接口實現
interface Interface1
interface Interface2
namespace 接口實現
interface Interface1
interface Interface2
interface Interface3:Interface1,Interface2
class Bird
class Ostrich:Bird
class Eagle : Bird
class Sparrow : Bird
using System.Collections.Generic;
namespace 接口實現
using System;
namespace 接口實現
using System;
namespace 接口實現
using System;
namespace 接口實現
using System;
namespace 接口實現
using System;
namespace 接口實現
using System;
namespace 接口實現
Console.WriteLine("我是氣球,我也會飛");
using System;
namespace 接口實現
Console.WriteLine("我是天鵝,我會飛" );
1、接口的聲明
接口:描述屬於任何類或者結構的一組相關功能,是一種規範、功能
組成:屬性、方法、事件、索引或者這四種成員的任意組合構成
基本知識點:
1)接口默認的權限修飾符是:public,不允許加權限修飾符【如:interface IEatable{},不能是public interface IEatable{}】,成員也不能加abstract【正確是:string Name{get;set};public string Name{get;set;}是錯的】
2)不能有字段:public string _name;是錯的【首先修飾符不能加,默認是public,string _name違反了不能有字段】
3)接口中不能有字段,所以屬性被寫作自動屬性,因為無法操作字段:
string Name{
get;
set;
}
4)不允許寫實現方法體的函數: void Write(); 不能是:
void Write(){
..............;
}
方法的返回值不受影響。
5)實現過程必須在實現接口中的類中完成。
6)接口命名:接口一般以大寫字母I開頭,跟在I後面也是大寫字母,結尾able 如:IFlyable
實例相關代碼筆記:
Program.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 接口
{
//public interface IFlyable
//{
//實際不這樣做
//}
class Program//類默認private
{
static void Main(string[] args)
{
}
}
}
IEatable.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 接口
{
interface IEAtable//接口默認是public
{
string Name//接口中不能有訪問修飾符 如:public string Name錯的
{
get;
set;//無字段,寫成自動屬性,無法操作字段
}
//接口不能有字段,所以屬性經常(必須)被寫作自動屬性
void Write();//不能包含方法體
string Read();//返回值不受影響
//string _name;//不能有訪問修飾符,不能有字段,所以不能用
//接口成員不允許添加訪問修飾符默認是public不能加abstract
//實現過程必須在實現接口的類中完成
}
}
2、接口的實現和繼承
1)類繼承接口具有單繼承,而接口繼承接口是多重繼承
2)接口多重繼承時,派生接口名與父接口用冒號隔開,多個父接口用逗號隔開;父接口也稱為該接口的顯示基接口。
單一繼承:
namespace 接口實現
{
interface Interface4:Interface3
{
}
}
多重繼承:
namespace 接口實現
{
interface Interface3:Interface1,Interface2
{
}
}
2)不同的接口(不包含派生)中允許有同名的成員
interface Interface1
{
void read();
}
interface Interface2
{
void read();
}
3)同一接口中成員名不能重名,即使類型(一個是屬性、一個是方法)名不同
namespace 接口實現
{
interface Interface2
{
void read();
string read
{
get;
set;
} //錯誤的
//同一接口中成員名不能重名,即使類型(一個是屬性,一個是方法)不同
//不同的接口(不包含派生)中允許有同名的成員
}
}
4)如果在派生接口中對顯示基接口中的成員進行重定義,需要用new 關鍵字解除警告。
interface Interface1
{
void read();
}
interface Interface2
{
void write();
}
interface Interface3:Interface1,Interface2
{
new void write();//void write();沒有錯誤,但會有警告
}
5)為什麽用到接口?開放封閉原則:軟件實體應該可以擴展,但不可以修改。對擴展是開放的,對修改是是封閉的,封閉就是不可以操縱。
舉例示例:鴕鳥、麻雀、老鷹都是鳥,鳥作為父類供子類繼承
class Bird
{
public void write(){
Console.WriteLine("我是鳥類!");
}
}
class Ostrich:Bird
{
public void write()
{
Console.WriteLine("我是鴕鳥,我吃青草!");
}
}
class Eagle : Bird
{
public void Eat() {
Console.WriteLine("我是老鷹,吃小雞");
}
}
class Sparrow : Bird
{
public void write()
{
Console.WriteLine("我是麻雀!");
}
}
如果要加實現“飛”的功能,但鴕鳥不會飛,解決方案:
1>在父類中加飛的方法,它不會飛,但鴕鳥繼承了父類,方案不可選。
2>在子類中加飛的方法,誰會飛就加飛的方法,完全可以,但違背開放封閉原則。如果分別在子類中去實現飛的方法,在子類中就可以進行修改,但軟件實體不能擴展,每新增一個會飛的內容就需要在子類中修改。
3>上例中如果新增一個氣球、飛機,它們繼承鳥(飛的方法)的父類就不合適。然而接口可以,提供了會飛的方法,麻雀需要會飛,就實現接口;鴕鳥不會就不需要繼承。
6)接口的實現
IFlyable.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 接口實現
{
interface IFlyable
{
void Fly();
}
}
Bird.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 接口實現
{
abstract class Bird
{
public abstract void Eat();
//public void write(){
//Console.WriteLine("我是鳥類!");
//}
}
}
Program.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 接口實現
{
class Program
{
static void Main(string[] args)
{
IFlyable[] fly={new Sparrow(),new Eagle(),new Swan(),new Balloon()};//接口類型的數組
foreach(IFlyable outFly in fly)
outFly.Fly();
Console.ReadKey();
}
}
}
Ostrich.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 接口實現
{
class Ostrich:Bird
{
public override void Eat()
{
Console.WriteLine("我是鴕鳥,我吃青草!");
}
}
}
Eagle.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 接口實現
{
class Eagle : Bird,IFlyable
{
public void Fly() {
Console.WriteLine("我是老鷹,會飛");
}
public override void Eat() {
Console.WriteLine("我是老鷹,吃小雞");
}
}
}
Sparrow.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 接口實現
{
class Sparrow : Bird,IFlyable
{
//接口的實現需要在實現接口的類中進行,重寫下
public void Fly()
{
Console.WriteLine("我是麻雀,我會飛");
}
public override void Eat()
{
Console.WriteLine("我是麻雀!吃糧食");
}
}
}
Balloon.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 接口實現
{
class Balloon:IFlyable
{
public void Fly() {
Console.WriteLine("我是氣球,我也會飛");
}
}
}
Swan.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 接口實現
{
class Swan:Bird,IFlyable
{
public override void Eat() {
Console.WriteLine("我是天鵝,我吃魚");
}
public void Fly() {
Console.WriteLine("我是天鵝,我會飛" );
}
}
}
運行結果:
--7)現實顯示接口
C#接口--C#基礎