我目前的主题是代码共享。建议使用访问修饰符internal
在多个文件之间共享代码。但是吗?或者我弄错了?我无法发布链接,因为每个人都无法访问该来源。
是否可以在一个文件中定义一个类(如接口或抽象类),并在另一个文件中实现它(并在此处使用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
?这可能吗?怎么样?
答案 0 :(得分:4)
internal
是一个访问修饰符,用于处理可以访问您的函数的代码。如果要将类分解为同一名称空间中的多个文件,那么您要查找的是partial
关键字。
https://msdn.microsoft.com/en-us/library/wa80x488.aspx
partial
不允许您两次定义相同的函数定义;你需要覆盖或虚拟化,或者使用基类,如果这是你的目标。部分方便有时候很方便,但如果你不确定在哪里可以找到哪个类,它可能会导致一个有点混乱的解决方案。
答案 1 :(得分:2)
internal
说明符用于限制正在包含的程序集中使用的类/成员。
代码共享是通过partial
类实现的。你可以参加一个班级
在一个文件中,另一个在另一个文件中。
在文件A中
public partial class MyClass
{
public void Foo()
{
}
}
在文件B中
public partial class MyClass
{
public void Bar()
{
}
}
您不能像在C ++中那样在一个文件中定义一个文件和定义。
如果您有此类要求,则应考虑interface
或abstract
类。
答案 2 :(得分:1)
访问修饰符仅处理谁可以查看代码,而不是如何实现代码 最合适的方法是使用abstract classes。
举个例子:
df %>%
group_by(Receipt_no) %>%
summarise(new = paste(Product, collapse = ','))
答案 3 :(得分:0)
对不起,我知道为时已晚,但是我仍然想给出答案。 看来您的问题来自“萨马林大学”,所以:
还是可以在使用内部访问修饰符的同时在一个文件中定义Load()并在另一个文件中定义OpenData()?这可能吗?怎么样?
是的。您应该在外部使用OpenData()
方法,并在每个特定于平台的项目中实现它。您无需在“共享项目”中使用此方法。如下所示:
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()
方法。