Как предотвратить экземпляры унаследованных классов

#c# #inheritance

#c# #наследование

Вопрос:

Я хочу заставить любой класс не иметь возможности создавать новый экземпляр, если он наследует определенный базовый класс, так как же должен выглядеть этот базовый класс?

Комментарии:

1. Конкретный или любой? Если ответ какой-либо, вы могли бы использовать sealed ключевое слово.

2. тогда в чем смысл наследования от этого базового класса? приведите пример того, что вы хотите сделать

3. Это бессмыслица. Попробуйте задать это лучше, на примере.

4. Давайте постараемся иметь в виду, что английский не для всех является основным языком.

Ответ №1:

Следующий код написан на java. просто чтобы привести вам пример

Базовый класс имеет исключение в конструкторе.

 public class BaseClass 
{
    public BaseClass()
    {
        throw new AssertionError();
    }
}
  

Дочерний класс, расширяющий базовый класс, но если вы создадите его объект, он выдаст вам исключение.

 public class MainClass extends BaseClass 
{
    public MainClass()
    {

    }

    public static void main(String[] args) {
        MainClass c = new MainClass();
    }
}
  

Комментарии:

1. Это делает невозможным создание экземпляра этого. И как бы вы это использовали?

2. это самое близкое решение, которое я ищу, но я рекомендую, если оно больше связано с дизайном, чем с созданием исключения. в качестве дополнительного объяснения я хочу заставить классы выглядеть как служебные классы, они должны быть без состояния, а все их методы и атрибуты статическими, точно так же, как класс Math, теперь я считаю, что я не могу заставить методы или атрибуты быть статичными, но, по крайней мере, я хочу убедиться, что эти классы не могут быть созданы. короче говоря, рассмотрим этот класс Math и другой класс с тем же дизайном, как я могу сделать эти классы не имеющими состояния, унаследовав базовый класс?

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

4. мммм, тогда я думаю, что создание исключения будет моим единственным решением.

Ответ №2:

Вы хотите запечатать свой базовый класс.

 public sealed class BaseClass
{
    public BaseClass(){};
}



public class SubClass : BaseClass
{
    public SubClass(){};
}
  

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

Ответ №3:

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

Ответ №4:

вы можете объявить базовый класс как const — таким образом, другие классы не смогут его расширить.

Ответ №5:

Вы не можете этого сделать. Пожалуйста, укажите, почему вы хотите это сделать.