C# 接口、抽象类中的方法
本文关键字:方法 抽象类 接口 | 更新日期: 2023-09-27 18:30:45
接口中声明的方法总是抽象的吗?如何使用抽象类和接口实现多重继承。实现与Java的实现不同吗?
接口中声明的方法总是抽象的吗?
是的!C# 接口只能包含抽象方法。
我们如何在接口中使用静态方法。
我很确定你不能在接口中声明静态方法。即使你可以,这样做也没有意义。静态方法可以在任何地方调用,对吧?那么为什么要将它们放在界面中呢?将它们放在静态类中!
如何使用抽象类和接口实现多重继承。
我们不能。C# 不支持多重继承。一个类只能从一个类继承!这是因为C++中的多重继承大大增加了代码的复杂性。但是类可以实现多个接口。我们只能对它们进行多态性。
顺便说一句,抽象类是一种类。
实现是否与Java的实现不同
这取决于你所说的实现是什么意思。
如果您指的是实现接口的方式,是的,它们几乎(如果不是全部)相同*。如果你指的是接口的语言实现,不,每种语言都是不同的。
*但是,在 C# 中,您可以显式实现接口。在Java中你不能。
编辑:
阅读您的评论后,我知道您想要一个示例来显示继承抽象类和接口的类。幸运的是,我做了一个项目,它包含这种东西!
我很久以前写了一个俄罗斯方块游戏,这是它的基本模型。
我有一个代表单个俄罗斯方块的TetrisBlock
类。以及代表俄罗斯方块块的Tetrimino
类,例如
口
口口口
Tetriminos有很多种,所以Tetrimino
是一个抽象类。而诸如 LShapedTetrimino
或 TShapedTetrimino
之类的类继承自它。
特三米诺可以旋转,但有些不能,例如
口口
口口
所以可以旋转的实现了一个名为 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{
...
}
为什么要重写静态方法? 它甚至说静态...我一般建议您阅读有关模式的信息,您可能会找到解决问题的方法。