可以使用“internal”访问修饰符将 class 拆分为多个文件吗?
Can `internal` access modifier be used to split a class over multiple files?
我目前的话题是代码分享。建议可以使用访问修饰符 internal
在多个文件之间共享代码。但是吗?还是我弄错了?我不能 post link,因为不是每个人都可以访问源代码。
是否可以在一个文件中定义 class(如接口或抽象 class)并在另一个文件中实现它(并使用 internal
这里)?
这是一些伪代码(显然无法正常工作)。一个文件中的定义:
internal static class SongLoader
{
internal async static Task<IEnumerable<Song>> Load();
internal async static Task<Stream> OpenData();
}
在另一个文件中实现:
internal static class SongLoader
{
internal const string Filename = "songs.json";
internal static async Task<IEnumerable<Song>> Load()
{
// implementation
}
internal static Stream OpenData()
{
// implemenation
}
}
或者是否可以在一个文件中定义 Load()
而在另一个文件中定义 OpenData()
,同时使用 internal
访问修饰符?这可能吗?怎么样?
internal
是一个访问修饰符,用于处理哪些代码可以访问您的函数。如果您想将 class 分解为同一命名空间内的多个文件,您正在寻找的是 partial
关键字。
https://msdn.microsoft.com/en-us/library/wa80x488.aspx
partial
不会让你定义同一个函数定义两次;如果这是您的目标,您将需要覆盖或虚拟化,或者使用基础 class。 Partial 有时很方便,但如果您不确定在哪里可以找到什么 class,它可能会导致解决方案有些混乱。
访问修饰符只处理谁可以看到代码,而不处理代码的实现方式。
做你想做的最接近的方法是使用 abstract classes.
举个例子:
internal abstract class SongLoader //under SongLoader.cs
{
internal async virtual Task<IEnumerable<Song>> Load();
internal async virtual Task<Stream> OpenData();
}
internal sealed class SongLoaderImplementer : SongLoader //under SongLoaderImplementer.cs
{
internal override async Task<IEnumerable<Song> Load() {}
internal override async Task<Stream> OpenData() {}
}
internal
说明符用于限制 class/members 在包含程序集以外的地方使用。
代码共享是通过 partial
classes 实现的。您可以拥有 class 的一部分
在一个文件中,另一部分在另一个文件中。
在文件 A 中
public partial class MyClass
{
public void Foo()
{
}
}
在文件 B 中
public partial class MyClass
{
public void Bar()
{
}
}
不能像C++那样在一个文件中声明,在一个文件中定义。
如果你有这样的需求,你应该考虑interface
或abstract
classes。
对不起,我知道为时已晚,但我还是想给出一个答案。
看来你的问题来自"Xamarin university",所以:
Or is it possible to have Load() defined in one file and OpenData() in another, while using internal access modifier? Is this possible? How?
是的。您应该在外部取出 OpenData()
方法并在每个特定于平台的项目中实现它。您不需要在 "Shared project" 中使用此方法。喜欢以下内容:
Android 项目:
internal class SongLoaderManager
{
internal static Stream OpenData(string fileName)
{
return Android.App.Application.Context.Assets.Open(fileName);
}
}
IOS 项目:
internal class SongLoaderManager
{
internal static Stream OpenData(string fileName)
{
return System.IO.File.OpenRead(fileName);
}
}
共享项目:
public static partial class SongLoader
{
const string Filename = "songs.json";
public static async Task<IEnumerable<Song>> Load()
{
using (var reader = new StreamReader(SongLoaderManager.OpenData(Filename)))
{
return JsonConvert.DeserializeObject<List<Song>>(await reader.ReadToEndAsync());
}
}
// NOT NEEDED ANYMORE
//public static Stream OpenData()
//{
// // TODO: add code to open file here.
// return null;
//}
}
在每个平台中,您可以定义自己的 OpenData()
具有不同行为的方法。
我目前的话题是代码分享。建议可以使用访问修饰符 internal
在多个文件之间共享代码。但是吗?还是我弄错了?我不能 post link,因为不是每个人都可以访问源代码。
是否可以在一个文件中定义 class(如接口或抽象 class)并在另一个文件中实现它(并使用 internal
这里)?
这是一些伪代码(显然无法正常工作)。一个文件中的定义:
internal static class SongLoader
{
internal async static Task<IEnumerable<Song>> Load();
internal async static Task<Stream> OpenData();
}
在另一个文件中实现:
internal static class SongLoader
{
internal const string Filename = "songs.json";
internal static async Task<IEnumerable<Song>> Load()
{
// implementation
}
internal static Stream OpenData()
{
// implemenation
}
}
或者是否可以在一个文件中定义 Load()
而在另一个文件中定义 OpenData()
,同时使用 internal
访问修饰符?这可能吗?怎么样?
internal
是一个访问修饰符,用于处理哪些代码可以访问您的函数。如果您想将 class 分解为同一命名空间内的多个文件,您正在寻找的是 partial
关键字。
https://msdn.microsoft.com/en-us/library/wa80x488.aspx
partial
不会让你定义同一个函数定义两次;如果这是您的目标,您将需要覆盖或虚拟化,或者使用基础 class。 Partial 有时很方便,但如果您不确定在哪里可以找到什么 class,它可能会导致解决方案有些混乱。
访问修饰符只处理谁可以看到代码,而不处理代码的实现方式。
做你想做的最接近的方法是使用 abstract classes.
举个例子:
internal abstract class SongLoader //under SongLoader.cs
{
internal async virtual Task<IEnumerable<Song>> Load();
internal async virtual Task<Stream> OpenData();
}
internal sealed class SongLoaderImplementer : SongLoader //under SongLoaderImplementer.cs
{
internal override async Task<IEnumerable<Song> Load() {}
internal override async Task<Stream> OpenData() {}
}
internal
说明符用于限制 class/members 在包含程序集以外的地方使用。
代码共享是通过 partial
classes 实现的。您可以拥有 class 的一部分
在一个文件中,另一部分在另一个文件中。
在文件 A 中
public partial class MyClass
{
public void Foo()
{
}
}
在文件 B 中
public partial class MyClass
{
public void Bar()
{
}
}
不能像C++那样在一个文件中声明,在一个文件中定义。
如果你有这样的需求,你应该考虑interface
或abstract
classes。
对不起,我知道为时已晚,但我还是想给出一个答案。 看来你的问题来自"Xamarin university",所以:
Or is it possible to have Load() defined in one file and OpenData() in another, while using internal access modifier? Is this possible? How?
是的。您应该在外部取出 OpenData()
方法并在每个特定于平台的项目中实现它。您不需要在 "Shared project" 中使用此方法。喜欢以下内容:
Android 项目:
internal class SongLoaderManager
{
internal static Stream OpenData(string fileName)
{
return Android.App.Application.Context.Assets.Open(fileName);
}
}
IOS 项目:
internal class SongLoaderManager
{
internal static Stream OpenData(string fileName)
{
return System.IO.File.OpenRead(fileName);
}
}
共享项目:
public static partial class SongLoader
{
const string Filename = "songs.json";
public static async Task<IEnumerable<Song>> Load()
{
using (var reader = new StreamReader(SongLoaderManager.OpenData(Filename)))
{
return JsonConvert.DeserializeObject<List<Song>>(await reader.ReadToEndAsync());
}
}
// NOT NEEDED ANYMORE
//public static Stream OpenData()
//{
// // TODO: add code to open file here.
// return null;
//}
}
在每个平台中,您可以定义自己的 OpenData()
具有不同行为的方法。