Можем ли мы создать более 1 экземпляра, используя Private Constructor? - PullRequest
0 голосов
/ 03 апреля 2019

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

public class Test
{
    public int val ;
    private Test(int sent)
    {
        val=val +sent;
    }
    public static void Callme(int  GetVal)
    {
        Test obj=new Test(GetVal);
        Console.WriteLine(obj.val);
    }
}
public class Program
{
    public static void Main()
    {       
        Test.Callme(10);
        //Console.WriteLine(Test.val);
        Test.Callme(20);
        //Console.WriteLine(Test.val);
    }
}

Согласно тому, что я знаю, следует создать 2 объекта класса. Нужна помощь в понимании этого.

Ответы [ 4 ]

4 голосов
/ 03 апреля 2019

Мы все знаем, что мы не можем создать объект класса с закрытым конструктором.

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

сколько экземпляров этого класса может быть создано

В вашем примере кода есть два экземпляра класса Test.

Я думаю, чтоВас может сбить с толку, если вы ожидаете, что второй Console.WriteLine напечатает 30, но он напечатал 20.Это потому, что public int val ; является членом экземпляра.Если бы это был статический элемент, он напечатал бы 30

1 голос
/ 03 апреля 2019

Может быть, что-то вроде этого то, что вы ищете:

public static Test Callme(int GetVal)
{
    Test obj = new Test(GetVal);
    Console.WriteLine(obj.val);
    return obj;
}

А затем создайте новые экземпляры, такие как:

Test test1 = Test.Callme(10);
Test test2 = Test.Callme(20);

Таким образом, вы можете легко получить доступ к членам каждогопример.Например, test1.val

0 голосов
/ 03 апреля 2019

Поскольку метод Callme является статическим, он создается системой в какой-то момент перед его использованием, а затем остается в памяти для будущих вызовов. Существует только одна копия статического члена класса, когда-либо созданного, независимо от того, сколько экземпляров класса создано.

0 голосов
/ 03 апреля 2019

Callme метод является статическим методом. Статические методы не требуют вызова экземпляра объекта. Они не имеют ссылки this (ключевое слово) и могут быть вызваны непосредственно в классе. В вашей ситуации Test.CallMe(someValue). Обратите внимание, что здесь не задействован экземпляр объекта. Если бы CallMe НЕ был статическим методом, вам понадобился бы экземпляр / объект для его вызова. Например

Test ob = new Test();
ob.CallMe(someValue);

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

Это означает, что CallMe может получить доступ к конструктору, поскольку CallMe является членом класса, а конструктор является членом класса, поэтому они оба могут обращаться друг к другу.

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

Так что в текущем примере CallMe создает экземпляр класса каждый раз, когда он вызывается. Если вы позвоните CallMe 2 раза, вы создадите 2 экземпляра класса.

...