接口中声明的方法总是抽象吗?。我们如何使用抽象类和接口实现多重继承。实现是否与java的实现不同?
答案 0 :(得分:3)
接口中声明的方法是否总是抽象的?
是的! C#接口只能包含抽象方法。
我们如何在接口中使用静态方法。
我很确定你不能在接口中声明静态方法。即使你可以,也没有必要这样做。静态方法可以在任何地方调用,对吧?那你为什么要把它们放在界面里呢?把它们放在静态类中吧!
我们如何使用抽象类和接口实现多重继承。
我们做不到。 C#不支持多重继承。一个班级可以从一个班级继承 !这是因为C ++中的多重继承极大地增加了代码的复杂性。但是类可以实现多个接口。我们只能用它们做多态。
不过,抽象类是一种类。实现是否与java
的实现不同
这取决于您的实施意味着什么。
如果你的意思是实现接口的方式,是的,它们几乎(如果不是全部)相同*。如果你的意思是接口的语言实现,不,每种语言都不同。
*但是在C#中,您可以显式实现接口。在Java中你不能。
编辑:
阅读完评论后,我知道你想要一个示例,展示一个继承抽象类和接口的类。幸运的是,我做了一个项目,它包含了这样的东西!
我很久以前写过一个俄罗斯方块游戏,这是它的基本模型。
我有一个TetrisBlock
类代表一个俄罗斯方块。还有一个代表俄罗斯方块块的Tetrimino
类,例如
口
口口口
有很多类型的tetriminos,所以Tetrimino
是一个抽象类。 LShapedTetrimino
或TShapedTetrimino
等类继承自它。
然而,有些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)
为什么要覆盖静态方法?它甚至说静态...... 我会特别推荐你阅读有关模式的内容,你可能会找到解决问题的方法。