0

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

4 回答 4

4

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

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

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

于 2016-06-30T11:34:18.077 回答
2

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

代码共享是通过partial类实现的。您可以将类的一部分放在一个文件中,而将另一部分放在另一个文件中。

在文件 A

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

在文件 B

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

您不能像在 C++ 中那样在一个文件中声明和在一个文件中定义定义。如果你有这样的要求,你应该想想interface还是abstract上课。

于 2016-06-30T11:43:56.697 回答
1

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

举个例子:

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() {}
}
于 2016-06-30T11:42:12.593 回答
0

对不起,我知道为时已晚,但我仍然想给出一个答案。看来您的问题来自“Xamarin 大学”,所以:

或者是否可以在一个文件中定义 Load() 而在另一个文件中定义 OpenData(),同时使用内部访问修饰符?这可能吗?如何?

是的。您应该从外部取出OpenData()方法并在每个特定于平台的项目中实现它。您不需要在“共享项目”中使用此方法。如下:

安卓项目:

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()在每个平台中,您可以使用不同的行为定义自己的方法。

于 2018-07-21T20:20:10.930 回答