可以使用`internal`访问修饰符将一个类拆分为多个文件吗?

时间:2016-06-30 11:30:24

标签: c# access-modifiers code-sharing

我目前的主题是代码共享。建议使用访问修饰符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?这可能吗?怎么样?

4 个答案:

答案 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 ++中那样在一个文件中定义一个文件和定义。 如果您有此类要求,则应考虑interfaceabstract类。

答案 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()方法。