我在C#.NET中编写了以下代码
public interface IWork
{
void func();
}
public abstract class WorkClass
{
public void func()
{
Console.WriteLine("Calling Abstract Class Function");
}
}
public class MyClass:WorkClass,IWork
{
}
Run Code Online (Sandbox Code Playgroud)
在编译时,我没有收到任何错误.编译器并没有强迫我实现方法"func();" 在"MyClass"中,它来自接口"IWork".Latter,我可以优雅地创建类"MyClass"的实例并调用函数"func()".为什么编译器不强迫我在"MyClass"中实现"func()"方法(它来自"IWork"接口?这是C#中的一个缺陷吗?
在阅读这个主题时,我发现我不能轻易地把它全部放在我的脑海中,所以我编写了下面的一段代码,它充当了C#如何工作的备忘单.希望它可以帮助某人.
public interface IMyInterface
{
void FunctionA();
void FunctionB();
void FunctionC();
}
public abstract class MyAbstractClass : IMyInterface
{
public void FunctionA()
{
Console.WriteLine( "FunctionA() implemented in abstract class. Cannot be overridden in concrete class." );
}
public virtual void FunctionB()
{
Console.WriteLine( "FunctionB() implemented in abstract class. Can be overridden in concrete class." );
}
public abstract void FunctionC();
}
public class MyConcreteClass : MyAbstractClass, IMyInterface
{
public override void FunctionB()
{
base.FunctionB();
Console.WriteLine( "FunctionB() implemented in abstract class but optionally overridden in concrete class." );
}
public override void FunctionC()
{
Console.WriteLine( "FunctionC() must be implemented in concrete class because abstract class provides no implementation." );
}
}
class Program
{
static void Main( string[] args )
{
IMyInterface foo = new MyConcreteClass();
foo.FunctionA();
foo.FunctionB();
foo.FunctionC();
Console.ReadKey();
}
}
Run Code Online (Sandbox Code Playgroud)
给出以下输出:
FunctionA()在抽象类中实现.具体类不能覆盖.
FunctionB()在抽象类中实现.可以在具体类中重写.
FunctionB()在抽象类中实现,但可选择在具体类中重写.
FunctionC()必须在具体类中实现,因为抽象类不提供实现.
为了更好地理解接口背后的概念,我只是给你正确的实现代码:
public interface IWork{
void func();
}
public abstract class WorkClass,IWork{
public void func(){
Console.WriteLine("Calling Abstract Class Function");
}
}
public class MyClass:WorkClass{
...
}
Run Code Online (Sandbox Code Playgroud)
基本规则:您需要始终在实现所在的位置包含接口.因此,如果在抽象类中创建方法并定义此方法的接口,则需要将接口实现到抽象类中,然后所有子类将自动实现此接口.
事实上,接口有两种功能可以用于:
1)作为一个"真正的"接口,提供实现接口的任何类的通用处理,因此您可以只通过一个接口处理几种类(不知道它们的真实类名).而"处理"意味着:调用方法.
2)作为其他(框架)程序员的帮助,不要搞砸你的代码.如果要确保方法不会被其他名称替换,则可以为包含所有"必须"方法名称的类定义接口.即使该方法被调用,您的程序员在更改方法名称时也会收到编译错误消息.
现在,您可以Myclass通过界面轻松处理您的问题IWork.
因为abstract类实现了接口。
如果您的类MyClass不会继承自WorkClass您,则会收到一条错误消息'MyClass' does not implement interface member 'IWork.func()': 。
但您也继承自WorkClass,它实际上实现了接口所需的方法。
func()如果您想强制从它继承的类实现它,您可以将其标记为抽象,如下所示:
public abstract class WorkClass
{
public abstract void func();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21089 次 |
| 最近记录: |