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

本文关键字:方法 抽象类 接口 | 更新日期: 2023-09-27 18:30:45

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

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

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

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

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

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

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

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

顺便说一句,抽象类是一种类。

实现是否与Java的实现不同

这取决于你所说的实现是什么意思。

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

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

编辑:

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

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

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

   口
口口口

Tetriminos有很多种,所以Tetrimino是一个抽象类。而诸如 LShapedTetriminoTShapedTetrimino 之类的类继承自它。

然而,有些

特三米诺可以旋转,但有些不能,例如

口口
口口

所以可以旋转的实现了一个名为 IRotatable 的接口

public interface IRotatable {
    void Rotate ();
}

如果你还不知道,接口实现是"可以用作"或"有能力"的关系。所以在这种情况下,有些特三米诺人有能力旋转,但有些没有。这就是为什么有些tetriminos实现了接口,而有些则没有。

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

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

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

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

一个类

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

多重继承概念在 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{
...
}

为什么要重写静态方法? 它甚至说静态...我一般建议您阅读有关模式的信息,您可能会找到解决问题的方法。