这与语言无关,因为我的问题适用于任何具有interface
概念的语言。 (或快速协议)
在C#中考虑此程序:
interface Inter1
{
int Count();
}
interface Inter2
{
int Count();
}
public class SomeClass : Inter1, Inter2
{
public int Count() // which one is it ?
{
return 0;
}
}
static void Main(string[] args)
{
Inter1 c = new SomeClass();
int i = c.Count();
}
或在C ++中: https://godbolt.org/z/dFLpji
我很难理解为什么可以容忍,尽管看起来所有可能的符号引用都是明确的,因为静态类型将指定我们正在谈论的功能。
但这不是很危险地接近姓名隐藏吗?
我正在考虑的问题的说明:
// in FileA.cs on day 0
interface DatabaseCleaner
{
void Execute();
}
// in FileFarAway.cs day 140
interface FragmentationLogger
{
void Execute(); // unfortunate naming collision not noticed
}
// in PostGreAgent.cs day 141
public class PostGreAgent : DatabaseCleaner, FragmentationLogger
{
public void Execute()
{ // I forgot about the method for database cleanup, or dismissed it mentally for later. first let's test this
allocator.DumpFragmentationInfo();
}
private Allocator allocator;
}
// client.cs
AgentsManager agents;
void Main(string[] args)
{
var pa = new PostGreAgent();
agents.Add(pa);
// ... later in a different location
DatabaseCleaner cleaner = agents.FindBest();
cleaner.Execute(); // uh oh
}
答案 0 :(得分:0)
这里没有歧义。
接口/协议只是一系列要求,要求实现/遵循该对象的对象必须能够执行的操作。 if (notification.additionalData.foreground) {
// code as your functionality
} else {
console.log("else", notification);
this.handleNofication(notification.additionalData);
}
handleNofication(data) {
// here you can also pass data
this.app.getRootNav().setRoot("RosterPage", { direction: "forward" });
}
和Inter1
都说,实现它的人必须能够Inter2
。因此,如果可以Count()
,则可以实现两个接口。就这么简单。这里没有歧义,因为Count()
的一个实现。 Count
和Inter1.Count
是同一件事。
请注意,在C#中,您可以显式实现接口,本质上为Inter2.Count
和Count
提供了Inter1
的不同实现。行为是非显式实现将隐藏显式实现,因此您只能使用接口的编译时类型访问显式实现。