Предотвратить воздействие базовых классов (абстрактные классы) - PullRequest
0 голосов
/ 16 октября 2018

Итак, я просмотрел много связанных вопросов, и ни один из них, кажется, не подходит полностью.По крайней мере, в моем нынешнем понимании.Поскольку это простая проблема, я собираюсь быть кратким с моим вопросом и кодом.

У меня есть пять классов:

internal class A
internal abstract class B : A
internal abstract class C : B
public class D : C
public class E {
    public void X(C c) { }
}

Здесь есть очевидная проблема доступности с параметромC используется в public методе.Мне нужно получить доступ к классу D, не выставляя класс C.Я полагаю, что это может быть связано с природой ключевого слова abstract и моим минимальным опытом его использования.

На сегодняшний день у меня никогда не было известной необходимости создавать класс abstract, и этоя впервые имею дело с этим на этом уровне.Насколько я понимаю, в этом случае нет необходимости использовать abstract классы, если я не забываю правильно все реализовать.


Мои вопросы

  • СледуетЯ создаю класс F, который имеет частный экземпляр D в качестве оболочки для предотвращения экспозиции?
  • Что является веской причиной для использования abstract, поскольку я не верю, что этот кодхороший пример этого.
  • Какие еще способы я могу выставить D, не подвергая A, B или C?

Примечания

  • Я пытаюсь провести хирургическое вмешательство с моими текущими изменениями.
  • Изначально все классы были частными.

Я просмотрел много похожих постов (Вот некоторые из них):

1 Ответ

0 голосов
/ 16 октября 2018

Вы можете использовать интерфейсы, чтобы скрыть детали.Учтите это:

//This represents the contract, regardless of the underlying object
public interface ISomeObject
{

}

//Class is internal, but implements the interface
internal class A : ISomeObject { }
internal abstract class B : A { }
internal abstract class C : B { }

//Class D is still internal
internal class D : C { }

public class E
{   
    //Method uses interface, which is public     
    public void X(ISomeObject c) { }

    public ISomeObject DoSomething()
    {
        //Create internal class, return it for use (as a contract)
        return new D();
    }
}

Пример использования:

var e = new E();
var result = e.DoSomething();
e.X(result);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...