C# использовать методы базового класса только в выбранных производных классах - PullRequest
0 голосов
/ 18 марта 2020

У меня есть общие функции, которые должны использоваться только некоторыми производными классами. Чтобы кодировать каждую функцию только один раз, я использую базовый класс. Мне нужно определить функции как защищенные, чтобы скрыть их в производных классах, которые их не используют, поэтому нет возможности использовать виртуальные и переопределить, потому что уровень защиты не может быть изменен в этом случае. Вот мой код Это работает так, как я хотел, но ios нет лучшего способа сделать это?

  class Base
  {
    protected void Initialize()
    {
    }

    protected void doTask1()
    {
    }

    protected void doTask2()
    {
    }
}

class Derived1 : Base
{
    public void Initialize()
    {
        base.Initialize();
    }

    public new void doTask1()
    {
        base.doTask1();  
    }
}

class Derived2 : Base
{
    public void Initialize()
    {
        base.Initialize();
    }

    public new void doTask2()
    {
        base.doTask2();
    }
}

Любая помощь приветствуется ...

doTask1 () должна быть доступна только в классе Derived1 и doTask2 () только в классе Derived2. Благодаря ответу @Fildor я решил это с помощью интерфейсов. Все производные классы являются производными от одного базового класса. Базовый класс реализует все функции в интерфейсах.

public class Base : I_Derived1, I_Derived2 
{
  // implementations of all methods ...
  doTask1()  
  {  // ...   
  }
  doTask2()  
  {  // ...   
  }
  initialize()   
  {  // ...   
  }
{

public interface I_Derived1
{
  doTask1();
  initialize();
}
public interface I_Derived2
{
  doTask2();
  initialize();
}

class Derived1 : Base
{
}
class Derived2 : Base
{
}

// then the interfaces are used ...

I_Derived1 d1 = new Base();
I_Derived2 d2 = new Base();

d1.doTask1();
d2.initialize();
d2.doTask2();
// ...

Это решило мою проблему, спасибо. В моем реальном проекте некоторые функции класса Base используются 10 или более производными классами, некоторые - всеми, а некоторые - только 2 или 3. Пользователь получает DLL, которая обслуживает его. Списки экземпляров производного класса, каждый из которых позволяет ему использовать функции, которые имеют для этого смысл.

1 Ответ

3 голосов
/ 18 марта 2020

Я думаю, вам было бы лучше, если бы здесь были только интерфейсы:

public interface IInit{
  void Initialize();
}

public interface I1: IInit {
   void DoTask1();
}

public interface I2: IInit {
   void DoTask2();
}

public class Impl: I1, I2
{
   public void Initialize() { /*...*/  }
   public void DoTask1(){ /*...*/  }
   public void DoTask2(){ /*...*/  }
}

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

Impl obj = new Impl();
obj.Initialize();
obj.DoTask1(); // both
obj.DoTask2(); // visible

I1 obj1 = new Impl();
obj1.Initialize();
obj1.DoTask1();
// obj1.DoTask2(); < not visible

I2 obj2 = new Impl();
obj2.Initialize();
// obj2.DoTask1(); < not visible
obj2.DoTask2();

Вы могли бы даже сделать этот шаг еще дальше с явными реализациями интерфейса .

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