webForumDet fria alternativet

Ang. konstruktorer och instansiering

.NET

9 svar · 608 visningar · startad av Prästen

Medlem sedan dec. 2000537 inlägg
Frågan#1

Hallo. En snabb fråga bara.

OleDbDataReader objDataReader;

Hur kommer det sig att OleDbDataReader ej behöver instansieras med en konstruktor tex såhär:
OleDbDataReader objDataReader=new OleDbDataReader(); ?

Medlem sedan mars 20023 561 inlägg
#2

Det behöver den...? :q

Medlem sedan dec. 2000537 inlägg
#3

men jag gör ju bara såhär:

OleDbDataReader objDataReader=null;

Medlem sedan mars 20007 896 inlägg
#4

Ja, och då är inte objektet objDataReader instansierat. Du måste på något sätt skapa en instans, antingen via någon metod i en klass som gör det åt dig, eller själv genom att använda new OleDbDataReader().

Medlem sedan dec. 2000537 inlägg
#5

men det behövs ju inte verkar det som, här är en lite snippet från MSDN dokumentationen.

public void ReadMyData(string myConnString) {
   string mySelectQuery = "SELECT OrderID, CustomerID FROM Orders";
   OleDbConnection myConnection = new OleDbConnection(myConnString);
   OleDbCommand myCommand = new OleDbCommand(mySelectQuery,myConnection);
   myConnection.Open();
   OleDbDataReader myReader;
   myReader = myCommand.ExecuteReader();
   // Always call Read before accessing data.
   while (myReader.Read()) {
      Console.WriteLine(myReader.GetInt32(0) + ", " + myReader.GetString(1));
   }
   // always call Close when done reading.
   myReader.Close();
   // Close the connection when done with it.
   myConnection.Close();
Medlem sedan dec. 2000537 inlägg
#6

och det går heller inte att instansiera OleDbDataReader såhär:

OleDbDataReader objDataReader=new OleDbDataReader();

eftersom den saknar en konstruktor.
finns inget att instansiera liksom
:l

Medlem sedan mars 20007 896 inlägg
#7

Metoden ExecuteReader() i klassen OleDbCommand skapar en instans av klassen OleDbDataReader och returnerar sedan den. Därför kan du sedan använda den. Du kan aldrig använda ett objekt som du har tilldelat null. Det är alltså metoden ExecuteReader() som sköter all instansiering åt dig, men den sker utan att du behöver bry dig. :)

Medlem sedan mars 20007 896 inlägg
#8

Den saknar inte konstruktor, utan den är antagligen deklarerad som privat eller skyddad ( private eller protected alltså ). Endast den egna klassen eller en subklass kan då skapa en instans av klassen OleDbDataReader. Instansiering måste ske för att man ska kunna använda ett objekt.

Medlem sedan dec. 2000537 inlägg
#9

men va skumt, en annan klassmetod sköter instansieringen av ett annat objekt, vad kallas det och var kan man läsa lite om det?.

Medlem sedan mars 20007 896 inlägg
#10

Ja du, jag vet inte om det har något namn eller om man kan läsa någonstans om det. Men det är inte så krångligt, det är i stort sett som vanlig instansiering. Se följande klasser.

class MyA {
     private MyA() { }

     public static MyA getInstance() {
          MyA myinstance = new MyA(); // Endast den egna klassen kan komma åt konstruktorn i MyA som deklarerades privat
          return myinstance;
     }
}

class MyB {
     public void Something() {
          MyA mya = new MyA(); // Fungerar [b]inte[/b], eftersom att konstruktorn för MyA deklarerades privat
          MyA mya = MyA.getInstance(); // Fungerar, eftersom att metode returnerar en instans av klassen MyA
     }
}

Följande bör fungera smärtfritt också:

class MyA {
     protected MyA() {}

     ...
}

class MyB : MyA {
     public MyA createMyAInstance() {
          MyA mya = new MyA();
          return mya;
     }
}

class MyC {
     public void Something() {
          MyB myb = new MyB();
          MyA mya = myb.createMyAInstance();
     }
}

Eftersom att konstruktorn för MyA är deklarerad protected så kommer endast subklasser åt den. På det här sättet fungerar det troligtvis med OleDbCommand och OleDbDataReader.

260 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)