2016-06-30 4 views
0

Тема, в которой я сейчас живу, - это обмен кодами. Предполагается, что использование модификатора доступа internal для обмена кодами между несколькими файлами возможно. Но так ли? Или я ошибаюсь? Я не могу опубликовать ссылку, потому что источник недоступен для всех.Может ли модификатор доступа `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

внутри файлов в одной сборке: https://msdn.microsoft.com/en-us/library/7c5ka91b.aspx –

+0

@Stanley: Да, он должен быть в одной сборке, потому что он скомпилирован в один и тот же проект (см. [Общие проекты] (https://developer.xamarin.com/guides/cross-platform/application_fundamentals/shared_projects/)). – grabner

+1

'internal' - это просто модификатор видимости. Это не имеет никакого отношения к разделению класса на несколько файлов. Ключевое слово для этого - 'partial'. Но нет такого понятия, как «определение класса», которое вы описываете. Наиболее близкими являются «частичные методы», но они должны возвращать 'void', и они всегда являются частными методами. –

ответ

2

internal спецификатор используется для ограничения класса/членов, используемый в других, чем содержащей сборке.

Обмен кодами осуществляется через классы partial. Вы можете иметь часть класса в одном файле, а другую часть - в другом файле.

В файл А

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

В Файл Б

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

Вы не можете иметь декларацию в одном файле и определение в одном файле, как в C++. Если у вас есть такие требования, вы должны подумать о классах interface или abstract.

+0

В моем случае было бы полезно спрятать член между различными сборками. Поэтому я мог бы иметь разные реализации, но также использовать один и тот же «контракт». О расколе декларации и определении: Это был всего лишь пример того, как каким-то образом достичь обмена кодами. В моем конкретном примере 'Foo()' вызывает 'Bar()', но существуют разные варианты 'Bar()' в зависимости от сборки. – grabner

+0

Вы не можете в принципе иметь ту же функцию, реализованную специально для разных сборок. Если вы расскажете больше о проблеме, которую у вас есть, мы можем обсудить альтернативные решения. –

+0

Я хочу получить некоторые знания в вариантах обмена кодами. «internal» упоминался как один из вариантов (помимо «partial»). Поэтому «внутреннее», похоже, не помогает в обмене кода. Теперь я попытался использовать 'partial', как вы предложили, но я не вижу здесь полной пользы. Если вас это интересует, вы можете посмотреть мои попытки [здесь] (https://codeshare.io/dDOXz). – grabner

4

internal - модификатор доступа, который имеет отношение к тому, какой код может получить доступ к вашим функциям. То, что вы ищете, это ключевое слово partial, если вы хотите разбить класс на несколько файлов в одном и том же пространстве имен.

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

partial не позволит вам определить такое же определение функции в два раза; вам нужно переопределить или виртуализировать или работать с базовым классом, если это то, к чему вы стремитесь. Частично удобно, но это может привести к некоторому загроможденному решению, если вы не знаете, какой класс можно найти где.

+1

Вы не можете определить одну и ту же функцию дважды с частичными классами, которые, на мой взгляд, являются тем, что хочет OP –

+0

Вы правы, если он ищет одно и то же определение функции дважды, это не сработает. Вы должны переопределить базовую функцию, если это маршрут, который вы ищете. Я добавил этот комментарий к моему ответу, чтобы быть в безопасности. – MartijnK

1

Модификаторы доступа касаются только тех, кто может видеть код, а не как он реализован.
Ближайший способ сделать то, что вы хотите, это использовать 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() {} 
} 
Смежные вопросы