Squeak.ru - шаблоны программирования

Почему у меня есть доступ к внутренним методам за пределами пространства имен?

Я пытаюсь понять модификаторы доступа, но немного не понимаю, как использовать internal.

У меня есть класс в пространстве имен, который выглядит так:

namespace Grids
{
    public abstract class Grid
    {
        internal abstract Vector2Int ToGrid(float worldX, float worldY);
        internal Vector2Int ToGrid(Vector3 worldPoint) => ToGrid(worldPoint.x, worldPoint.z);
        internal Vector2Int ToGrid(Vector2 worldPoint) => ToGrid(worldPoint.x, worldPoint.y);
    }
}

Затем это реализуется в унаследованном классе следующим образом:

namespace Grids
{
    public class RectGrid : Grid
    {
        public int Width;
        public int Height;
        public Grid(int w, int h)
        {
             Width = w;
             Height = h;
        }
        internal override Vector2Int ToGrid(float worldX, float worldY)
        {
            int col = Mathf.FloorToInt(worldX / Width);
            int row = Mathf.FloorToInt(worldY / Height);
            return new Vector2Int(col, row);
        }
    }
}

Итак, теперь я создаю класс для использования этой сетки, которая не является частью пространства имен:

using Grids;
using UnityEngine;

public class MapGenerator : MonoBehaviour
{
    private RectGrid _rectGrid;
    
    void Awake() {
        _rectGrid = new RectGrid(1,1);   
        _rectGrid.ToGrid(Vector3.zero); // why do i have access to this function         
    }
}

Но по какой-то причине у меня есть доступ к функциям, которые должны быть внутренними:

Почему это ? Я не хочу раскрывать эту функцию, я хочу, чтобы она была доступна только моему классу Map, который имеет то же пространство имен Grids и будет контролировать то, что я делаю. Тем не менее, мой класс MapGenerator имеет доступ, даже не будучи частью пространства имен?

Я неправильно понял, как здесь работает внутреннее?


  • Внутренние типы или члены доступны только внутри файлов в той же сборке 24.08.2020
  • Вы читали документацию? Обратите внимание на сборку слова, а не на пространство имен. 24.08.2020
  • Ах не был уверен, что это значит. Черт, тогда это раздражает - сложно придумать способ скрыть эти функции, но при этом предоставить доступ к определенному классу. 24.08.2020
  • difficult to design a way to hide these functions but still give access to a specific class. возможно защищенный? 24.08.2020
  • Как предоставить защищенный класс Map, который не наследует его, но имеет ссылку Grid? По сути, я хочу, чтобы Map контролировал, какие методы предоставляются из класса Grid, который MapGenerator будет вызывать для создания карты. 24.08.2020
  • Возможны ли внутренние классы? 24.08.2020

Ответы:


1

Согласно документации internal (справочник по C#)

Внутренние типы или члены доступны только в файлах одной сборки

Согласно вашему комментарию

[Трудно] разработать способ скрыть эти функции, но при этом предоставить доступ к определенному классу.

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

Однако вы можете использовать явный интерфейс Реализация. Это не будет полностью ограничивать доступ, но сделает так, что вам нужно будет явно запрашивать его и скрывать в любое другое время.

public interface IGrid
{
    Vector2Int ToGrid(...);
}

public abstract class Grid : IGrid
{
   Vector2Int IGrid.ToGrid(...) {}
}

Использование

var rectGrid = new RectGrid();
((IGrid)rectGrid).ToGrid(); // you need to explicitly cast to the interface
24.08.2020
  • Ах, я вижу, удивлен, что C # никогда не реализовывал больше способов управления доступом к функциям, таких как наличие контроллера для определения того, что должно быть общедоступным или защищенным для другого класса. Было бы очень полезно сделать использование библиотек немного менее загроможденным. 24.08.2020
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...