关于c#:关于抽象方法和接口方法的问题

Questions about Abstract method and interface method

本问题已经有最佳答案,请猛点这里访问。

嗨,我对抽象类和接口有一些疑问

我不会问接口和抽象类之间的区别。我只是在问抽象方法和接口方法的区别

抽象方法与接口方法相同。我知道如果我们继承了子类中的接口和抽象类,那么我们必须实现那些边方法,但是我们不能实现非抽象方法。所以

  • my question is what is the different between abstract method and interface ?
  • 2". another question is we can partially implement the Non-abstract methods in abstract class , Is it possible to partially implement the abstract method in abstract class ?

    我也提到了很多网站,但没有人给出第二个问题的解决方案

    带代码的问题

    这是我的抽象类,有一个抽象方法(XXX),另一个非抽象方法(YYY)和接口方法(XXX)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public abstract class AbstractRam
    {
        public abstract int xxx();// What is the difference in interface method ?

        public int yyy()
        {
            return 2;
        }
    }

    public interface InterfaceRam
    {
        int xxx();// What is the difference in abstract method ?


    }

    我在另一个班继承了这两个

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public class OrdinaryClass : AbstractRam
    {
        public OrdinaryClass()
        {
            //
            // TODO: Add constructor logic here
            //
        }
        public override int xxx()
        {
            return 1;
        }
    }

    public class OrdinaryClass2 : InterfaceRam
    {
        public OrdinaryClass2()
        {
            //
            // TODO: Add constructor logic here
            //
        }
        public int xxx()
        {
            return 1;
        }
    }

    让我看看我的xxx方法,两种方法都是一样的,没有什么区别。

    question : Is it have any difference ? if is it same , then which one is the best way ?


  • 接口方法是抽象方法。是的,它们与抽象类中的抽象方法相同,因为它们都是抽象的。不过,这里要注意的是,当多态性发挥作用时,如何处理它们。这可以用以下代码来说明:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    interface IA
    {
        int xxx();
    }

    abstract class B
    {
        public abstract int yyy();
    }

    class C : B, IA
    {
        public int xxx()
        {
            return 1;
        }

        public int yyy()
        {
            return 1;
        }
    }
  • yyy定义实际上隐藏了b中的抽象方法,需要声明为public override int yyy()...以防止出现这种情况。

  • 不,不能"部分实现抽象类中的非抽象方法"。通过提供一些具体方法和一些抽象方法,可以部分实现抽象类。但是,不能"部分实现"抽象方法。抽象类中的方法要么是抽象的,要么不是。

  • 在您的代码示例中,OrdinaryClass提供了xxx的实现。OrdinaryClass2隐藏了这个抽象方法,并提供了自己的xxx。如(1)所述。请阅读c中隐藏方法的详细信息,例如http://www.akadia.com/services/dotnet_多态性.html和覆盖vs方法隐藏。


  • 最后我自己找到了答案。

    • 抽象方法和接口方法的最大区别是

    We can implement the abstract method in inside of the same abstract class , but we can't implement the interface method in inside of the same interface .