C#接口中的方法,抽象类

时间:2016-01-18 10:36:52

标签: java c# interface abstract-class

接口中声明的方法总是抽象吗?。我们如何使用抽象类和接口实现多重继承。实现是否与java的实现不同?

3 个答案:

答案 0 :(得分:3)

  

接口中声明的方法是否总是抽象的?

是的! C#接口只能包含抽象方法。

  

我们如何在接口中使用静态方法。

我很确定你不能在接口中声明静态方法。即使你可以,也没有必要这样做。静态方法可以在任何地方调用,对吧?那你为什么要把它们放在界面里呢?把它们放在静态类中吧!

  

我们如何使用抽象类和接口实现多重继承。

我们做不到。 C#不支持多重继承。一个班级可以从一个班级继承 !这是因为C ++中的多重继承极大地增加了代码的复杂性。但是类可以实现多个接口。我们只能用它们做多态

不过,抽象类是一种类。

  

实现是否与java

的实现不同

这取决于您的实施意味着什么。

如果你的意思是实现接口的方式,是的,它们几乎(如果不是全部)相同*。如果你的意思是接口的语言实现,不,每种语言都不同。

*但是在C#中,您可以显式实现接口。在Java中你不能。

编辑:

阅读完评论后,我知道你想要一个示例,展示一个继承抽象类和接口的类。幸运的是,我做了一个项目,它包含了这样的东西!

我很久以前写过一个俄罗斯方块游戏,这是它的基本模型。

我有一个TetrisBlock类代表一个俄罗斯方块。还有一个代表俄罗斯方块块的Tetrimino类,例如

   口
口口口

有很多类型的tetriminos,所以Tetrimino是一个抽象类。 LShapedTetriminoTShapedTetrimino等类继承自它。

然而,有些tetriminos可以旋转,但有些不能,例如

口口
口口

因此可以旋转的实现了一个名为IRotatable的接口。

public interface IRotatable {
    void Rotate ();
}

如果您还不知道,接口实现“可以用作”或“具有”关系的能力。所以在这种情况下,一些tetriminos有旋转的能力,但有些没有。这就是为什么有些tetriminos实现了界面,但有些则没有。

这一切都很有道理,不是吗?

“但我可以把旋转方法放在Tetrimino类中,为什么我需要一个接口呢?”您询问。那么,IMO,C#是一种面向对象的语言,而OOP的重点在于让事情变得有意义!有时候让代码变得有意义是件好事。我曾经对此感到困惑。我认为编写代码完全是实用的东西。但这不是全部。你还需要让事情变得有意义。这就是OOP的重点。

答案 1 :(得分:1)

是的,接口中声明的方法是抽象的。

接口仅包含方法定义,但不包含任何代码。您需要实现接口中定义的所有方法。 抽象类是一个无法实例化但可以包含代码的类。

一个类可以从多个接口继承。但是一个类只能从一个抽象类继承。

多重继承概念在C#和Java

中大致相同

示例代码

//ABSTRACT CLASS:
public abstract class Car
{
    public abstract void Manufactured(); //abstract method
}

public class Honda : Car
{
    public override void Manufactured()
    {
        Console.WriteLine("Honda is a Japanese car.");
    }
}

public class Renult : Car
{
    public override void Manufactured()
    {
        Console.WriteLine("Renault is a Franch car.");
    }
}

  //INTERFACE:
public interface IBike
{
    void Manufactured();
}
public interface KBike
{
    void Model();
}


public class Suzuki : IBike , KBike // multiple inheritance using interface
{
    public void Manufactured()
    {
        Console.WriteLine("Suzuki is prodused on Japan.");
    }
   public void Model()
    {
        Console.WriteLine("Suzuki is prodused on Japan.");
    }

}

带有接口和抽象类的样本

public interface IWork
{
void func();
}
public abstract class WorkClass,IWork
{
public void func()
{
    Console.WriteLine("Calling Abstract Class Function");
}}

public class MyClass:WorkClass{
...
}

答案 2 :(得分:1)

为什么要覆盖静态方法?它甚至说静态...... 我会特别推荐你阅读有关模式的内容,你可能会找到解决问题的方法。