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
修饰符。