Konstruktor klasy abstrakcyjnej w C#

Dlaczego jest możliwe napisanie konstruktora dla klasy abstrakcyjnej w C#?
Z tego, co wiem, nie możemy stworzyć abstrakcyjnej klasy.. do czego to służy?
Nie możesz utworzyć klasy, prawda?

Author: Adrian, 2011-04-08

12 answers

Ponieważ może istnieć standardowy sposób na utworzenie instancji danych w klasie abstrakcyjnej. W ten sposób możesz mieć klasy, które dziedziczą z tej klasy, wywołując konstruktor bazowy.

public abstract class A{

    private string data;

    protected A(string myString){
      data = myString;
    }

}

public class B : A {

     B(string myString) : base(myString){}

}
 285
Author: Craig Suchanec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-18 14:07:46

Z tego, co wiem, nie możemy utworzyć instancji klasy abstrakcyjnej

Tu jest twój błąd. oczywiście możesz utworzyć instancję klasy abstrakcyjnej.
abstract class Animal {}
class Giraffe : Animal {}
...
Animal animal = new Giraffe();
Tam jest zwierzę. Tworzysz instancję abstrakcyjnej klasy, tworząc z niej konkretną klasę i tworząc jej instancję. Pamiętaj, że instancja pochodnej klasy betonowej jest również instancją jej abstrakcyjnej klasy bazowej. instancja żyrafy jest również instancją zwierząt, nawet jeśli zwierzę jest abstrakcyjne.

Biorąc pod uwagę, że można utworzyć instancję klasy abstrakcyjnej, musi ona mieć konstruktor jak każda inna klasa, aby upewnić się, że jej niezmienniki są spełnione.

Klasa static jest klasą, której nie można utworzyć instancji i zauważysz, że tworzenie konstruktora instancji w klasie statycznej nie jest legalne.

 268
Author: Eric Lippert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-09 01:25:10

To sposób na wymuszenie zbioru niezmienników klasy abstrakcyjnej. Oznacza to, że bez względu na to, co robi podklasa, chcesz się upewnić, że pewne rzeczy są zawsze prawdziwe w przypadku klasy bazowej... przykład:

abstract class Foo
{
    public DateTime TimeCreated {get; private set;}

    protected Foo()
    {
         this.TimeCreated = DateTime.Now;
    }
}

abstract class Bar : Foo
{
    public Bar() : base() //Bar's constructor's must call Foo's parameterless constructor.
    { }
}

Nie myśl o konstruktorze jako dualnym operatorze new. Jedynym celem konstruktora jest upewnienie się, że obiekt jest w prawidłowym stanie, zanim zaczniesz go używać. Tak się składa, że zwykle nazywamy to operatorem new.

 24
Author: Rodrick Chapman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-09 00:28:58

Służy do wymuszania logiki inicjalizacji wymaganej przez wszystkie implementacje twojej klasy abstrakcyjnej lub wszelkie metody zaimplementowane na twojej klasie abstrakcyjnej (nie wszystkie metody na twojej klasie abstrakcyjnej muszą być abstrakcyjne, niektóre mogą być zaimplementowane).

Każda klasa, która dziedziczy z abstrakcyjnej klasy bazowej, będzie zobowiązana do wywołania konstruktora bazowego.

 5
Author: Ross Anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-08 23:35:53

Zwykle konstruktory wymagają inicjalizacji elementów składowych tworzonego obiektu. W koncepcji dziedziczenia, zazwyczaj każdy konstruktor klasy w hierarchii dziedziczenia jest odpowiedzialny za tworzenie instancji własnych zmiennych członkowskich. Ma to sens, ponieważ instancjacja musi być wykonana tam, gdzie zmienne są zdefiniowane.

Ponieważ klasa abstrakcyjna nie jest całkowicie abstrakcyjna( w przeciwieństwie do interfejsów), jest mieszanką zarówno elementów abstrakcyjnych, jak i konkretnych oraz elementów, które nie są abstrakcyjne są potrzebne do inicjalizacji, co odbywa się w konstruktorach klasy abstrakcyjnej, konieczne jest posiadanie konstruktorów w klasie abstrakcyjnej. Oczywiście konstruktory klasy abstrakcyjnej mogą być wywoływane tylko z konstruktorów klasy pochodnej.

 1
Author: zafar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-12 02:40:41

Masz absolutną rację. Nie możemy utworzyć instancji klasy abstrakcyjnej, ponieważ metody abstrakcyjne nie mają żadnego ciała, tzn. implementacja nie jest możliwa dla metod abstrakcyjnych. Ale może być kilka scenariuszy, w których chcesz zainicjować niektóre zmienne klasy bazowej. Możesz to zrobić używając słowa kluczowego base zgodnie z sugestią @Rodrick. W takich przypadkach musimy użyć konstruktorów w naszej klasie abstrakcyjnej.

 1
Author: noobprogrammer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-25 07:06:56

Możesz utworzyć instancję po zaimplementowaniu wszystkich metod. Wtedy zostanie wywołany konstruktor.

 0
Author: duedl0r,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-13 15:02:37

Ja też chcę błyszczeć na abstrakcyjnej powierzchni Wszystkie odpowiedzi obejmowały prawie wszystkie rzeczy. Still my 2 cents

Klasy abstrakcyjne są klasami normalnymi z kilkoma wyjątkami

  1. żaden klient/konsument tej klasy nie może utworzyć obiektu tego klasy, to nigdy nie oznacza, że konstruktor nigdy nie zadzwoni. Jego pochodna klasa może wybrać konstruktor do wywołania.(jak widać w jakiejś odpowiedzi)
  2. może mieć funkcję abstrakcyjną.
 0
Author: Sumit Kapadia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-03 16:28:42

Definiowanie konstruktora z klasą public lub internal storage w dziedzicznej klasie concreteThing efektywnie definiuje dwie metody:

  • Metoda (którą wywołam InitializeThing), która działa na this, nie ma wartości zwracanej i może być wywołana tylko z metod Thing'S CreateThing i InitializeThing oraz metod podklas' InitializeXXX.

  • Metoda (którą wywołam CreateThing), która zwraca obiekt oznaczonego typu konstruktora i zasadniczo zachowuje się as:

    Thing CreateThing(int whatever)
    {
        Thing result = AllocateObject<Thing>();
        Thing.initializeThing(whatever);
    }
    

Klasy abstrakcyjne skutecznie tworzą metody tylko pierwszej formy. Koncepcyjnie nie ma powodu, dla którego dwie "metody" opisane powyżej powinny mieć te same specyfikatory dostępu; w praktyce nie ma jednak sposobu, aby określić ich dostępność inaczej. Należy zauważyć, że jeśli chodzi o rzeczywistą implementację, przynajmniej w. Net, CreateThing nie jest tak naprawdę zaimplementowana jako metoda wywołania, ale zamiast tego reprezentuje sekwencję kodu, która jest wstawiana w newThing = new Thing(23); oświadczenie.

 0
Author: supercat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-11 09:51:57

Klasa abstrakcyjna może mieć zmienne członkowskie,które muszą być zainicjalizowane, więc mogą być inicjowane w konstruktorze klasy abstrakcyjnej i ten konstruktor jest wywoływany, gdy obiekt klasy pochodnej jest inicjowany.

 0
Author: waqar ahmed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-28 11:03:01

Z https://msdn.microsoft.com/en-us/library/ms182126.aspx

Konstruktory typów abstrakcyjnych mogą być wywoływane tylko przez typy pochodne. Ponieważ konstruktory publiczne tworzą instancje typu, a nie można utworzyć instancji typu abstrakcyjnego, Typ abstrakcyjny, który ma konstruktor publiczny, jest nieprawidłowo zaprojektowany.

Ponieważ tylko klasy pochodne mogą używać abstrakcyjnego konstruktora klasy, wtedy abstrakcyjny konstruktor klasy, w razie potrzeby, musi być zadeklarowany jako protected.

Jednakże, wspomniany kompilator VS nie będzie narzekał (z domyślnymi regułami) przy deklarowaniu konstruktorów publicznych w klasach abstrakcyjnych, jednak nie pozwoli na utworzenie nowej instancji.

 0
Author: Ahmad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-19 07:52:06

Istnieją dwie ważne cechy, które uniemożliwiają dziedziczenie klasy abstrakcyjnej

  1. Klasa abstrakcyjna musi mieć metodę abstrakcyjną, w przeciwnym razie nie jest to klasa abstrakcyjna

  2. Klasa abstrakcyjna musi być dziedziczona przez klasę pochodną, więc jeśli Klasa odziedziczona przez inną klasę niż to, co jest używane do tworzenia obiektu tej klasy

 -2
Author: pawan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-24 17:00:51