一般来说在类中实现接口不需要指定接口的名称,即隐式实现接口,接口成员默认public访问修饰符,不能额外定义访问修饰符,public也不行,隐式实现的接口成员,在类中访问修饰符也只能是public.
如果类实现的多个接口中,不同的接口中有同名的成员,如自动属性或方法等,那么必须指定该成员实现的是哪个接口,即显式实现接口成员,类中显式实现成员的访问修饰符默认为private,也只能是private, 这样显示实现的接口成员就只能被接口对象调用,防止被类对象调用,如下demo:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 显式隐式实现接口
{
class Program
{
static void Main(string[] args)
{
//声明接口对象,
IBird TianE = new Bird();
TianE.Age = 2;//显示实现iBird的接口属性IBird.Age,该成员只有IBird接口对象才能调用
IBird对象赋值的是Bird类对象,IBird对象能调用Bird类方法,这就是接口也能实现的多态效果
TianE.Fly();//IBird对象,可以调用实现该接口的Fly()方法
//Bird对象也能调用方法Fly()
((Bird)TianE).Fly();
//Bird成员Bark(),不是IBird的实现,所以TianE不能调用该方法,必须先强转成Bird对象才可以,如下
((Bird)TianE).Bark();
Bird maque = new Bird();
maque.Age = 1;//隐式实现接口属性Age,此时调用的是类的public属性Age,IBird修饰符为默认的private,就是为了方式被类调用
int x = maque.Age;
maque.Swim();
}
}
class Bird : IBird,IFish
{
private int age;
public void Fly()
{
Console.WriteLine("can fly");
}
//显示实现接口,接口名.接口成员名 访问修饰符private 防止类调用
int IBird.Age { get =>age; set => age = value; }
public void Swim()
{
Console.WriteLine("can swit");
}
public int Age { get=>age;set=> age = value; }
//Bird类的public方法,但不是IBird接口的实现成员
public void Bark()
{
Console.WriteLine("小鸟会叽叽喳喳叫");
}
}
interface IBird
{
void Fly();
//自动属性,快速实现方式:Prop + 两个Tab键
int Age { get; set; }
}
interface IFish
{
void Swim();
int Age { get; set; }
}
}