你好,我是C#程序员,这个视频提到Java无法实现接口组合?应该不会吧

来源:6-5 接口的组合

慕瓜8195663

2020-05-14

// C#的接口可以再继承多个接口来达到组合的效果,并且也带智能提示,
// 我的问题是,这节课是不是在讲这个宗旨?
// 接口一
public interface IRetriever
{
    void Get(string url);
}
// 接口二
public interface IPoster
{
    void Post(string url, Dictionary<string, string> );
}
// 组合接口
public interface IRetrieverPoster : IRetriever, IPoster
{
}
// 实现接口
public class MockRetriever : IRetrieverPoster
{
    public void Get(string url)
    {
        // implement
    }

    public void Post(string url, Dictionary<string, string> )
    {
        // implement
    }
}

const string url = "https://www.moc.com";
// 利用接口限制类型能力
string Download(IRetrieverPoster retrieverPoster)
{
        retrieverPoster.Get(url);
        retrieverPoster.Post(url, new Dictionary<string, string> {
            { "contens","author fake " },
            { "sxx","xx" },
        });

        return "ok";
}
// 最后使用特定的实现来提供不同能力的实现
public void Get()
{
        IRetrieverPoster s = new MockRetriever();

        Download(s);
}
写回答

2回答

ccmouse

2020-05-17

如果我们有public class RealRetriever : IRetriever, IPoster

那么这个RealRetriever就不能当作IRetrieverPoster来使用。这样的直接坏处是:如果我们无法修改RealRetriever的话,就需要为RealRetriever写个adapter。也许写一个adapter没什么大不了,但这里体现的点是代码和模型有了脱节。我们的模型是需要一个既可以Retrieve又可以Post的“东西”,我们也有这么一个东西在手上,就是RealRetriever,但是因为语言的限制没法直接拿来用。

再回到go语言说到这种隐式实现接口到底有什么好处是什么的话,我们要往大了看,就是看到duck typing的好处。这我们的确很难靠“想”来理解。我们可以打一个问号,在今后的项目实践中不断去体会duck typing带来的优缺点。

0
1
慕瓜8195663
非常感谢!
2020-06-07
共1条回复

慕瓜8195663

提问者

2020-05-15

我的理解是c#跟java一样不是duck typing ,外面的实现类必须明确继承接口,可是如果只是这样的话,想不通不继承接口有什么好处

0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程