是否可以使用“内部”访问修饰符将一个类拆分为多个文件?

本文关键字:一个 拆分 文件 内部 可以使 访问 是否 | 更新日期: 2023-09-27 17:53:17

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

是否可以使用“内部”访问修饰符将一个类拆分为多个文件?

internal是一个访问修饰符,用于处理哪些代码可以访问您的函数。你正在寻找的是partial关键字,如果你想把一个类分解成同一个命名空间内的几个文件。

https://msdn.microsoft.com/en-us/library/wa80x488.aspx

partial将不允许您定义相同的函数定义两次;您需要重写或虚拟化,或者使用基类(如果这是您的目标)。Partial有时很方便,但如果您不确定在哪里可以找到什么类,它可能会导致解决方案有些混乱。

internal说明符用于限制在包含程序集以外的其他程序集中使用的类/成员。

代码共享通过partial类实现。你可以参加一个课程在一个文件,另一部分在另一个文件。

In File A

public partial class MyClass
{
  public void Foo()
  {
  }
}

In File B

public partial class MyClass
{
  public void Bar()
  {
  }
}

不能像c++那样在一个文件中声明和定义。如果您有这样的需求,您应该考虑interfaceabstract类。

访问修饰符只处理谁可以看到代码,而不是如何实现。
最接近的方法是使用抽象类。

例如:

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() {}
}

对不起,我知道太晚了,但我还是想给一个答案。看来你的问题来自"Xamarin大学",所以:

或者可以在一个文件中定义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()方法。