C# 接口中的方法,摘要 类
Methods in C# Interfaces, Abstract classes
接口中声明的方法都是抽象的吗?如何使用抽象class和接口实现多重继承。实现方式与 java 不同吗?
是的,在接口中声明的方法是抽象的。
接口只包含方法定义,不包含任何代码。您需要实现接口中定义的所有方法。
抽象 class 是无法实例化但可以包含代码的 class。
一个class可能继承自多个接口。但是 class 只能继承一个抽象 class.
多重继承概念在 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.");
}
}
具有接口和抽象的示例class
public interface IWork
{
void func();
}
public abstract class WorkClass,IWork
{
public void func()
{
Console.WriteLine("Calling Abstract Class Function");
}}
public class MyClass:WorkClass{
...
}
Are the methods declared in interfaces always abstract?
是的! C# 接口只能包含抽象方法。
How do we use static methods in interfaces.
我很确定您不能在接口中声明静态方法。即使可以,也没有必要这样做。静态方法可以在任何地方调用,对吧?那么为什么要将它们放在一个界面中呢?将它们放在静态 class 中!
How do we achieve multiple inheritance using abstract class and interface.
我们不能。 C# 不支持多重继承。一个class只能继承一个class 只有!这是因为 C++ 中的多重继承大大增加了代码的复杂性。但是classes可以实现多个接口。我们只能对它们做多态
顺便说一句,抽象 classes 是一种 class.
Are the implementation different to that of java
这取决于您所说的实施是什么意思。
如果您指的是实现接口的方式,是的,它们几乎(如果不是全部)相同*。如果你指的是接口的语言实现,不,每种语言都不一样。
*但是在 C# 中,您可以显式实现接口。在 Java 你不能。
编辑:
阅读您的评论后,我知道您想要一个显示继承抽象 class 和接口的 class 的示例。幸运的是,我做了一个项目,它包含这样的东西!
我很久以前写过一个俄罗斯方块游戏,这是它的基本模型。
我有一个 TetrisBlock
class 代表一个俄罗斯方块。还有一个 Tetrimino
class 表示一个俄罗斯方块块,例如
口
口口口
俄罗斯方块的种类很多,所以Tetrimino
是抽象的class。而 class 等 LShapedTetrimino
或 TShapedTetrimino
继承自它。
不过,有些俄罗斯方块可以旋转,有些则不能,比如
口口
口口
因此可以旋转的实现了一个名为 IRotatable
的接口。
public interface IRotatable {
void Rotate ();
}
如果您还不知道,接口实现是 "can be used as" 或 "has the ability to" 关系。所以在这种情况下,有些俄罗斯方块有旋转的能力,有些则没有。这就是为什么一些 tetriminos 实现了接口,而另一些则没有。
这一切都很有道理,不是吗?
"But I can just put the rotate method in the Tetrimino class, why do I need an interface for that?" 你问了。好吧,IMO,C# 是一种面向对象的语言,而 OOP 的全部意义在于让事情变得有意义!有时让你的代码有意义是件好事。我过去常常对此感到困惑。我认为编写代码都是关于实用的东西。但这还不是全部。你还需要让事情变得有意义。这就是 OOP 的全部意义。
为什么要覆盖静态方法?它甚至说静态...
我一般会建议您阅读有关模式的内容,您可能会找到解决问题的方法。
接口中声明的方法都是抽象的吗?如何使用抽象class和接口实现多重继承。实现方式与 java 不同吗?
是的,在接口中声明的方法是抽象的。
接口只包含方法定义,不包含任何代码。您需要实现接口中定义的所有方法。 抽象 class 是无法实例化但可以包含代码的 class。
一个class可能继承自多个接口。但是 class 只能继承一个抽象 class.
多重继承概念在 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.");
}
}
具有接口和抽象的示例class
public interface IWork
{
void func();
}
public abstract class WorkClass,IWork
{
public void func()
{
Console.WriteLine("Calling Abstract Class Function");
}}
public class MyClass:WorkClass{
...
}
Are the methods declared in interfaces always abstract?
是的! C# 接口只能包含抽象方法。
How do we use static methods in interfaces.
我很确定您不能在接口中声明静态方法。即使可以,也没有必要这样做。静态方法可以在任何地方调用,对吧?那么为什么要将它们放在一个界面中呢?将它们放在静态 class 中!
How do we achieve multiple inheritance using abstract class and interface.
我们不能。 C# 不支持多重继承。一个class只能继承一个class 只有!这是因为 C++ 中的多重继承大大增加了代码的复杂性。但是classes可以实现多个接口。我们只能对它们做多态
顺便说一句,抽象 classes 是一种 class.
Are the implementation different to that of java
这取决于您所说的实施是什么意思。
如果您指的是实现接口的方式,是的,它们几乎(如果不是全部)相同*。如果你指的是接口的语言实现,不,每种语言都不一样。
*但是在 C# 中,您可以显式实现接口。在 Java 你不能。
编辑:
阅读您的评论后,我知道您想要一个显示继承抽象 class 和接口的 class 的示例。幸运的是,我做了一个项目,它包含这样的东西!
我很久以前写过一个俄罗斯方块游戏,这是它的基本模型。
我有一个 TetrisBlock
class 代表一个俄罗斯方块。还有一个 Tetrimino
class 表示一个俄罗斯方块块,例如
口
口口口
俄罗斯方块的种类很多,所以Tetrimino
是抽象的class。而 class 等 LShapedTetrimino
或 TShapedTetrimino
继承自它。
不过,有些俄罗斯方块可以旋转,有些则不能,比如
口口
口口
因此可以旋转的实现了一个名为 IRotatable
的接口。
public interface IRotatable {
void Rotate ();
}
如果您还不知道,接口实现是 "can be used as" 或 "has the ability to" 关系。所以在这种情况下,有些俄罗斯方块有旋转的能力,有些则没有。这就是为什么一些 tetriminos 实现了接口,而另一些则没有。
这一切都很有道理,不是吗?
"But I can just put the rotate method in the Tetrimino class, why do I need an interface for that?" 你问了。好吧,IMO,C# 是一种面向对象的语言,而 OOP 的全部意义在于让事情变得有意义!有时让你的代码有意义是件好事。我过去常常对此感到困惑。我认为编写代码都是关于实用的东西。但这还不是全部。你还需要让事情变得有意义。这就是 OOP 的全部意义。
为什么要覆盖静态方法?它甚至说静态... 我一般会建议您阅读有关模式的内容,您可能会找到解决问题的方法。