默认方法是什么
在Java1.8和C#8.0之后,都新增了接口的默认方法,即在接口中支持方法的默认实现,而不必在所有实现类中另外做实现,减小了实现类的修改工作量
两种语言的区别
Java:默认实现用default修饰,方法的访问级别为public,外部和实现类可以访问接口中的所有方法,
interface IA {
String getValue();
default void printString(String value) {
System.out.println(value);
}
}
class A implements IA {
public String getValue() {
return "Hello world";
}
}
class test
{
public static void main (String[] args)
{
IA a = new A();
a.printString(a.getValue());
}
}
C#:默认实现支持几乎所有的访问修饰符,子接口可以继承的方法和常规类的继承规则相同,但实现类不继承(或者叫隐藏)默认实现方法
支持的访问修饰符private
、protected
、internal
、public
、virtual、
abstract、
sealed、
static、
extern
和partial
using System;
class Test
{
static void Main(string[] args)
{
IA a = new A();
a.PrintString();
}
}
interface IA
{
protected string GetValue();
void PrintString()
{
Console.WriteLine(GetValue());
}
}
interface IB : IA
{
private void CallPrintString()
{
PrintString();
}
}
class A : IA
{
string IA.GetValue()
{
return "Hello world";
}
//void CallPrintString()
//{
// PrintString();
//}
}
需要注意的是,在类A中中是无法调用接口IA中的PrintString方法的错误 CS0103 当前上下文中不存在名称“PrintString” ,但在接口IB中是没有问题的
后记
C#中接口的访问修饰符可以保证接口不对外暴露私密的方法,Java想实现类似的方法可以用抽象类继承接口,实现类再继承抽象类,在抽象类中定义需要隐藏起来的逻辑