C# 多态、抽象和接口
这段代码编译时没有错误C# 多态、抽象和接口,c#,inheritance,interface,polymorphism,abstract-class,C#,Inheritance,Interface,Polymorphism,Abstract Class,这段代码编译时没有错误 class program { interface IA { void getName(string s); } interface IB { void getName(string s); } interface IC { void getName(string s); } public abstract class AC {
class program
{
interface IA
{
void getName(string s);
}
interface IB
{
void getName(string s);
}
interface IC
{
void getName(string s);
}
public abstract class AC
{
public abstract void getName(string s);
}
public class CA : AC , IA, IB, IC
{
public override void getName(string s)
{
Console.WriteLine(s);
}
}
static void Main()
{
CA ca = new CA();
Console.ReadLine();
}
}
实现了哪个getName
方法?如果我们有多个具有相同方法名称的接口,那么仅仅实现一个满足所有接口的方法就足够了吗?如果他们做不同的事情呢?请注意,我没有指定存在哪个getName
(与此时的解决方案不同)
谢谢大家。正在调用被重写的方法。为了使用接口中的方法,您必须按照以下步骤进行操作
((IB).getName(s));
您必须显式地调用这些方法
正在调用被重写的方法。为了使用接口中的方法,您必须按照以下步骤进行操作
((IB).getName(s));
您必须显式地调用这些方法
在代码中,CA类中的getName方法实现了所有3个接口。如果它们具有不同的含义,则必须使用显式接口实现:
public class CA : AC, IA, IB, IC
{
public override void getName(string s)
{
Console.WriteLine(s);
}
void IC.getName(string s)
{
// Your code
}
void IB.getName(string s)
{
// Your code
}
void IA.getName(string s)
{
// Your code
}
}
在代码中,CA类中的getName方法实现了所有3个接口。如果它们具有不同的含义,则必须使用显式接口实现:
public class CA : AC, IA, IB, IC
{
public override void getName(string s)
{
Console.WriteLine(s);
}
void IC.getName(string s)
{
// Your code
}
void IB.getName(string s)
{
// Your code
}
void IA.getName(string s)
{
// Your code
}
}
实现将用于满足所有三个接口中的函数。实现将用于满足所有三个接口中的函数。我猜您的类CA实现了所有三个接口和在CA中重写的抽象方法。因为它满足了类CA所需的所有实现,它不会抛出任何错误。如果您需要调用接口,请显式调用它们。我猜您的类CA实现了所有3个接口和在CA中重写的抽象方法。因为它满足了类CA所需的所有实现,所以它不会抛出任何错误。如果您需要调用接口,显式调用它们。实现将用于满足所有三个接口中的功能。@Tripkinetics谢谢。如果我删除
override
,编译器会抱怨抽象方法中的getName
没有实现。所以这似乎是单向的。@Zuzlx在接口中声明的成员和在抽象类中声明的成员是不同的。为了满足接口,您必须实现一个方法;为了满足抽象类,您必须重写一个方法。因为你必须明确地说我的方法覆盖了另一个方法,所以你必须使用覆盖
修饰符。该实现将用于满足所有三个接口中的函数。@Tripkinetics谢谢。如果我删除override
,编译器会抱怨抽象方法中的getName
没有实现。所以这似乎是单向的。@Zuzlx在接口中声明的成员和在抽象类中声明的成员是不同的。为了满足接口,您必须实现一个方法;为了满足抽象类,您必须重写一个方法。因为您必须明确地说我的方法覆盖了另一个方法,所以您必须使用override
修饰符。