master
bicijinlian 4 years ago
parent 471d47441e
commit 577e25c7e8

@ -1,18 +1,23 @@
# 接口学习
注意点C#8.0对接口有较大改动之前的教程不再适用。比如接口可以有默认实现可以有static静态对象。
## 接口定义
> 接口是一种契约和规范是指定一组对象的定义而非实现的引用类型是C#实现多继承的机制;也是多态的一种常用实现方式。
+ 微软An interface is a reference type that defines a set of members.
+ 译文:接口是定义一组特定对象(属性、方法、索引器、委托与事件)的引用类型。从 C# 8.0.NET Core 3.0及以上,但.net framework不支持开始接口可以为成员定义默认实现,也可以定义static方法这些方法必须有一个实现。
+ **组合式定义**接口是包含一组非抽象类或结构必须实现的相关功能定义的引用类型接口是一种编程契约和规范也是C#实现多继承的机制;又是多态的一种常用实现方式。
## 接口特点
1. 接口可以包含属性、方法、索引器、委托与事件等对象,但不能包含字段,也不能包含构造或析构函数(对象的创建与销毁,应该在实现类所关心的,接口只关心需要实现的功能约定)
1. 接口中的对象都是公开权限的,否则接口无意义:不能使用范围修饰符(public private internal protected
1. 不能有 static abstract virtual override sealed 等违反接口意义的修饰符
1. 接口只包含对象的定义,不能包含对象的实现,也不能直接实例化接口
1. 不能有 static abstract virtual override sealed 等违反接口意义的修饰符C#8.0之后static被允许。
1. 接口只包含对象的定义,不能包含对象的实现,也不能直接实例化接口. C#8.0之后,可以有默认实现,可以直接调用接口静态方法。
1. 接口的实现类必须实现接口中的所有成员除非实现类本身是抽象类通过具体的可执行代码实现接口抽象成员的操作接口实现子类中可用new关键字隐藏父接口中的方法。
1. 接口可以多继承可用来解决C#类的单继承问题
1. 接口名称一般都以“I”作为首字母以与实现类区分
1. 接口声明也适用于 “分部类”与“分部方法”
## 接口的隐式实现与显式实现

@ -0,0 +1,20 @@
# C#8 接口新功能学习
**.NET Core 3.0及以上版本** 和 **.NET Standard 2.1** 支持 C#8.0,详情参阅 [C#语言版本控制](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/configure-language-version)
C# 8的许多最新功能需要 .NET Core 3.x 中引入的库和运行时功能
+ 默认接口实现需要使用 .NET Core 3.0 CLR 中的新功能
+ 异步流需要使用新类型 System.IAsyncDisposable、System.Collections.Generic.IAsyncEnumerable<T> 和 System.Collections.Generic.IAsyncEnumerator<T>
+ 索引和范围需要使用新类型 System.Index 和 System.Range
+ 可为 null 的引用类型利用几个特性来提供更准确的警告。 这些特性是在 .NET Core 3.0 中添加的。 其他目标框架并未使用这些特性中的任何一种进行批注。 这意味着可为 null 的警告可能无法准确反映潜在问题。
## 接口新功能条件
+ C# 8.0及以上
+ **.NET Core3.0及以上** 或者 **.NET Standard 2.1** (.net framework不支持)
+ Visual Studio 2019 16.1 及以上
## 默认实现
## 静态方法支持
##

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace InterfaceStudy.Examine
{
public class ClassA : I
{
public int i = 1;
public ClassA()
{
++ i;
}
void I.Print()
{
Console.WriteLine(i);
}
public virtual void Print()
{
Console.WriteLine(++i);
}
}
}

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace InterfaceStudy.Examine
{
public class ClassB : ClassA, I
{
int i = -1;
public override void Print()
{
Console.WriteLine(--i);
}
}
}

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace InterfaceStudy.Examine
{
public class ClassC : ClassA
{
int i = -1;
public override void Print()
{
Console.WriteLine(--i);
}
}
}

@ -0,0 +1,11 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace InterfaceStudy.Examine
{
public interface I
{
void Print();
}
}

@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
</Project>

@ -0,0 +1,17 @@
using System;
namespace InterfaceStudy.Examine
{
class Program
{
static void Main(string[] args)
{
I i;
i = new ClassB();
i.Print();
i = new ClassC();
i.Print();
}
}
}

@ -0,0 +1,65 @@
# 考题
不运行代码20分钟内给出程序输出结果(两个数字)
## 请写出下面代码的输出
``` csharp
public interface I
{
void Print();
}
public class ClassA : I
{
public int i = 1;
public ClassA()
{
++ i;
}
void I.Print()
{
Console.WriteLine(i);
}
public virtual void Print()
{
Console.WriteLine(++i);
}
}
public class ClassB : ClassA, I
{
int i = -1;
public override void Print()
{
Console.WriteLine(--i);
}
}
public class ClassC : ClassA
{
int i = -1;
public override void Print()
{
Console.WriteLine(--i);
}
}
class Program
{
static void Main(string[] args)
{
I i;
i = new ClassB();
i.Print();
i = new ClassC();
i.Print();
}
}
```

@ -3,11 +3,13 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.31410.357
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InterfaceStudy.Core", "InterfaceStudy.Core\InterfaceStudy.Core.csproj", "{2F771F8A-B472-485D-816A-BB5B5C828DE2}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InterfaceStudy.Core", "InterfaceStudy.Core\InterfaceStudy.Core.csproj", "{2F771F8A-B472-485D-816A-BB5B5C828DE2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InterfaceStudy.App", "InterfaceStudy.App\InterfaceStudy.App.csproj", "{5578DC19-F9A7-4FE0-AB74-6A583A30E99B}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InterfaceStudy.App", "InterfaceStudy.App\InterfaceStudy.App.csproj", "{5578DC19-F9A7-4FE0-AB74-6A583A30E99B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InterfaceStudy.Test", "InterfaceStudy.Test\InterfaceStudy.Test.csproj", "{B7B58056-A189-4628-BE74-A16165B04BF7}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InterfaceStudy.Test", "InterfaceStudy.Test\InterfaceStudy.Test.csproj", "{B7B58056-A189-4628-BE74-A16165B04BF7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InterfaceStudy.Examine", "InterfaceStudy.Examine\InterfaceStudy.Examine.csproj", "{EF414F01-F39F-42BC-93E5-6B32B7EA3872}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -27,6 +29,10 @@ Global
{B7B58056-A189-4628-BE74-A16165B04BF7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B7B58056-A189-4628-BE74-A16165B04BF7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B7B58056-A189-4628-BE74-A16165B04BF7}.Release|Any CPU.Build.0 = Release|Any CPU
{EF414F01-F39F-42BC-93E5-6B32B7EA3872}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EF414F01-F39F-42BC-93E5-6B32B7EA3872}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EF414F01-F39F-42BC-93E5-6B32B7EA3872}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EF414F01-F39F-42BC-93E5-6B32B7EA3872}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

Loading…
Cancel
Save