c#回炉重造(七)接口,类继承多重接口,接口的显式实现

(一)接口

使用接口可以在类中包括来自多个源的行为。因为该语言不支持类的多重继承。 此外,如果要模拟结构的继承,也必须使用接口,因为它们无法实际从另一个结构或类继承。

我们创建一个接口,定义两个抽象类,接口不能声明实例数据,如字段、自动实现的属性或类似属性的事件,且接口的命名要以大写I开头。

interface IStuden
{
    void Add();
    void Bdd();
}

我们再创建两个类继承自接口,用于实现接口中的抽象方法。 

class NewStuden : IStuden
{
    public void Add()
    {
        Console.WriteLine(123);
    }

    public void Bdd()
    {
        Console.WriteLine(123);
    }
}
class WithStuden : IStuden
{
    public void Add()
    {
        Console.WriteLine(456);
    }
    public void Bdd()
    {
        Console.WriteLine(456);
    }
}

为了使耦合降低,我们再创建一个Quint类,里面构造一个构造器,接收一个IStuden接口类型的值,把他赋值给私有类_istuden,创建一个方法调用具体传入的那个类的方法。

class Quint
{
    private IStuden _istuden;
    public Quint(IStuden i)
    {
        _istuden = i;
    }
    public void Cdd()
    {
        _istuden.Add();
        _istuden.Bdd();
    }
}

运用的时候,我们对 Quint类创建实例化对象,传入你要使用的类,我这里将NewStuden类传入,只用修改我们传入的对象就可以,同时也避免了对代码的修改,遵循了开闭原则。

Quint q = new Quint(new NewStuden());
q.Cdd();

我们运行整体代码 查看结果,打印出来两个123,说明我们调用成功了NewStuden类中的两个方法。

8c1a366c3d8a44bfb30a7cda575f8b31.png

(二)类继承多重接口

我们都知道类继承类的话使单一的,但是类继承接口的话使可以继承许多的,一个接口可从一个或多个基接口继承。当接口重写基接口中的方法实现时,必须使用显式接口实现语法。

我们构建两个接口IStudent和ITeach,里面分别创建了一个Add和Bdd的抽象方法。

interface IStudent
{
    void Add();
}
interface ITeach
{
    void Bdd();
}

 我们再创建一个NewClass类来继承这两个接口,并且实现这两个接口中的抽象方法。

class NewClass : IStudent, ITeach
{
    public void Add()
    {
        Console.WriteLine(123);
    }

    public void Bdd()
    {
        Console.WriteLine(456);
    }
}

 我们对类创建实例化对象,并且运用这两个方法。

new NewClass().Add();
new NewClass().Bdd();

运行代码,我们可以看到将这两个方法都打印了出来,这就是类可以继承多重接口。

7d8c69218632453c9dc6157c152473a9.png

(三)接口的显式实现

接口的显式实现式c#语言所特有的,当我们使用类来继承多重接口,再创建实例化对象对方法的引用时,我们不想让其中一个抽象方法显示出来就需要使用到接口的显式实现,显式实现还用于处理两个接口分别声明名称相同的不同成员。

同样我们构建两个接口IStudent和ITeach,里面分别创建了一个Add和Bdd的抽象方法。

interface IStudent
{
    void Add();
}
interface ITeach
{
    void Bdd();
}

现在我们创建一个NewClass类来继承这两个接口,将其中的Add抽象方法构建为显式实现,Bdd抽象方法进行普通实现。

class NewClass : IStudent, ITeach
{
    public void Bdd()
    {
        Console.WriteLine(123);
    }

    void IStudent.Add()
    {
        Console.WriteLine(456);
    }
}

现在我们对NewClass类创建实例化对象,并且引出我们需要实现的方法,我们可以看到,我们只能对Bdd方法进行引用,Add方法不见了。

87ba5030abe04750bc4021baeddf2535.png

 当我们要使用Add方法的时候,需要这样做,用student可以看到Add方法但是看不到Bdd方法。

NewClass n = new NewClass();
IStudent student = n;
student.Add();

 或者我们可以使用我们要显示的那个接口来对类创建实例化对象,但是这样同样只能看到Add方法看不到Bdd方法。

IStudent student = new NewClass();
student.Add();

你可能不希望为这两个接口都调用相同的实现。 若要调用不同的实现,根据所使用的接口,可以显式实现接口成员。 显式接口实现是一个类成员,只通过指定接口进行调用。 通过在类成员前面加上接口名称和句点可命名该类成员。

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值