kzen.dev
  • Întrebări
  • Tag-uri
  • Utilizatori
Notificări
Recompense
Înregistrare
După înregistrare, veți primi notificări despre răspunsurile și comentariile la întrebările DVS.
Logare
Dacă aveţi deja un cont, autentificaţi-vă pentru a verifica notificările noi.
Aici vor fi recompensele pentru întrebările, răspunsurile și comentariile adăugate sau modificate.
Mai mult
Sursă
Editează
 lomaxx
lomaxx
Question

Apelarea constructor de bază în C#

Dacă am moștenit de la o clasă de bază și doresc să treacă ceva de la constructorul a moștenit clasa a constructorului din clasa de baza, cum fac asta?

De exemplu,

Dacă am moștenit de Excepție clasă vreau să fac ceva de genul asta:

class MyExceptionClass : Exception
{
     public MyExceptionClass(string message, string extraInfo)
     {
         //This is where it's all falling apart
         base(message);
     }
}

Practic, ceea ce vreau este de a fi capabil de a trece string mesaj de la baza Excepție de clasă.

1388 2008-08-15T07:39:23+00:00 10
Ola Ström
Ola Ström
Întrebarea editată 5 aprilie 2019 в 11:32
Programare
constructor
c#
inheritance
Solution / Answer
Jon Limjap
Jon Limjap
15 august 2008 в 7:40
2008-08-15T07:40:22+00:00
Mai mult
Sursă
Editează
#8415706

Modifica constructor la următoarea, astfel încât se numește clasă de bază constructor în mod corespunzător:

public class MyExceptionClass : Exception
{
    public MyExceptionClass(string message, string extrainfo) : base(message)
    {
        //other stuff here
    }
}

Rețineți că un constructor nu este ceva la care poți apela oricând într-o metodă. Ca's motivul pentru care ai're obtinerea erori în apel în constructorul corpului.

1727
0
 Axl
Axl
28 aprilie 2010 в 5:34
2010-04-28T17:34:20+00:00
Mai mult
Sursă
Editează
#8415709

Rețineți că puteți utiliza static metode cadrul apelului de constructor de bază.

class MyExceptionClass : Exception
{
     public MyExceptionClass(string message, string extraInfo) : 
         base(ModifyMessage(message, extraInfo))
     {
     }

     private static string ModifyMessage(string message, string extraInfo)
     {
         Trace.WriteLine("message was " + message);
         return message.ToLowerInvariant() + Environment.NewLine + extraInfo;
     }
}
 Abhishek
Abhishek
Răspuns editat 31 august 2015 в 5:17
486
0
 armanali
armanali
27 februarie 2013 в 2:22
2013-02-27T02:22:07+00:00
Mai mult
Sursă
Editează
#8415711

Dacă aveți nevoie pentru a apela constructor de bază, dar nu imediat, pentru că noi (derivate) clasa are nevoie pentru a face unele de manipulare a datelor, cea mai bună soluție este de a recurge la metoda fabrică. Ceea ce trebuie să faceți este de a marca privat derivate constructor, apoi face o metodă statică din clasa ta, care va face toate lucrurile necesare și mai târziu apela constructorul și a reveni la obiect.

public class MyClass : BaseClass
{
    private MyClass(string someString) : base(someString)
    {
        //your code goes in here
    }

    public static MyClass FactoryMethod(string someString)
    {
        //whatever you want to do with your string before passing it in
        return new MyClass(someString);
    }
}
 armanali
armanali
Răspuns editat 7 aprilie 2013 в 8:52
94
0
Janus Pedersen
Janus Pedersen
11 noiembrie 2013 в 11:32
2013-11-11T11:32:42+00:00
Mai mult
Sursă
Editează
#8415712

Este adevărat folosi "de bază" (ceva) pentru a apela clasa de baza constructorul, dar în caz de supraîncărcare a folosi "această" cheie

public ClassName() : this(par1,par2)
{
// do not call the constructor it is called in the this.
// the base key- word is used to call a inherited constructor   
} 

// Hint used overload as often as needed do not write the same code 2 or more times
 shA.t
shA.t
Răspuns editat 9 aprilie 2018 в 11:46
33
0
 SnowBEE
SnowBEE
4 decembrie 2009 в 5:03
2009-12-04T05:03:34+00:00
Mai mult
Sursă
Editează
#8415708
public class MyExceptionClass : Exception
{
    public MyExceptionClass(string message,
      Exception innerException): base(message, innerException)
    {
        //other stuff here
    }
}

Puteți trece interior excepție de la unul dintre constructori.

26
0
 Fab
Fab
24 ianuarie 2016 в 7:34
2016-01-24T07:34:21+00:00
Mai mult
Sursă
Editează
#8415715

Din Cadru liniile Directoare de Proiectare și FxCop reguli.:

1. Personalizat Excepție ar trebui să aibă un nume care se termină cu Excepția

    class MyException : Exception

2. Excepție ar trebui să fie publice

    public class MyException : Exception

3. CA1032: Excepție ar trebui să implementeaza standardul constructori.

  • O publice parameterless constructor.
  • Un constructor publice cu un șir de argumente.
  • Un constructor publice cu o singură coardă și de Excepție (cum se poate încadra o altă Excepție).
  • O serialization constructor protejate în cazul în care tipul nu este sigilat și privat în cazul în care tipul este sigilat. Bazat pe MSDN:

[Serializable()] public class MyException : Excepție { public MyException() { // Adauga orice tip specific de logică, și de aprovizionare mesajul implicit. }

public MyException(string mesaj): base(mesaj) { // Adauga orice tip-specifice logica. } public MyException(string mesaj, Excepție innerException): de bază (mesaj, innerException) { // Adauga orice tip-specifice logica pentru interior excepții. } protejate MyException(SerializationInfo info, StreamingContext context) : baza(informatii, context) { // Pune în aplicare specifice tipului de serialization constructor logica. } }

sau

    [Serializable()]
    public sealed class MyException : Exception
    {
      public MyException()
      {
         // Add any type-specific logic, and supply the default message.
      }

      public MyException(string message): base(message) 
      {
         // Add any type-specific logic.
      }
      public MyException(string message, Exception innerException): 
         base (message, innerException)
      {
         // Add any type-specific logic for inner exceptions.
      }
      private MyException(SerializationInfo info, 
         StreamingContext context) : base(info, context)
      {
         // Implement type-specific serialization constructor logic.
      }
    }  
19
0
 wchoward
wchoward
27 mai 2016 в 9:27
2016-05-27T21:27:43+00:00
Mai mult
Sursă
Editează
#8415717

Puteți face, de asemenea, condiționată verifica cu parametrii în constructor, care permite o oarecare flexibilitate.

public MyClass(object myObject=null): base(myObject ?? new myOtherObject())
{
}

sau

public MyClass(object myObject=null): base(myObject==null ? new myOtherObject(): myObject)
{
}
 wchoward
wchoward
Răspuns editat 11 iunie 2018 в 10:47
15
0
 CShark
CShark
14 martie 2017 в 12:38
2017-03-14T12:38:53+00:00
Mai mult
Sursă
Editează
#8415718

Ca pe unele de celelalte răspunsuri enumerate aici, puteți trece parametrii în baza constructorul clasei. Este recomandat pentru a apela dumneavoastră de bază constructorul clasei la începutul constructor pentru a moștenit de clasă.

public class MyException : Exception
{
    public MyException(string message, string extraInfo) : base(message)
    {
    }
}

Am act de faptul că, în exemplul tău niciodată nu a făcut uz de extraInfo parametru, deci am presupus că ai vrea să înlănțui pe extraInfo parametru șir la Mesajul proprietate de excepție (se pare că acest lucru este ignorat în răspunsul acceptat și codul în cauză).

Acest lucru este pur și simplu realizat prin invocarea clasa de baza constructorul, și apoi actualizarea Mesaj de proprietate cu informatii suplimentare.

public class MyException: Exception
{
    public MyException(string message, string extraInfo) : base($"{message} Extra info: {extraInfo}")
    {
    }
}
 CShark
CShark
Răspuns editat 19 martie 2019 в 6:31
8
0
 Tutankhamen
Tutankhamen
26 februarie 2015 в 4:11
2015-02-26T04:11:37+00:00
Mai mult
Sursă
Editează
#8415714
class Exception
{
     public Exception(string message)
     {
         [...]
     }
}

class MyExceptionClass : Exception
{
     public MyExceptionClass(string message, string extraInfo)
     : base(message)
     {
         [...]
     }
}
8
0
Donat Sasin
Donat Sasin
7 aprilie 2016 в 12:06
2016-04-07T12:06:09+00:00
Mai mult
Sursă
Editează
#8415716
public class MyException : Exception
{
    public MyException() { }
    public MyException(string msg) : base(msg) { }
    public MyException(string msg, Exception inner) : base(msg, inner) { }
}
Donat Sasin
Donat Sasin
Răspuns editat 22 martie 2017 в 1:10
7
0
Adăugati o întrebare
Categorii
Toate
Tehnologii
Cultură
Viață / Artă
Stiință
Profesii
Afaceri
Utilizatori
Toate
Nou
Populare
1
工藤 芳則
Înregistrat 6 zile în urmă
2
Ирина Беляева
Înregistrat 1 săptămână în urmă
3
Darya Arsenyeva
Înregistrat 1 săptămână în urmă
4
anyta nuam-nuam (LapuSiK)
Înregistrat 1 săptămână în urmă
5
Shuhratjon Imomkulov
Înregistrat 1 săptămână în urmă
DA
DE
EL
ES
FR
ID
IT
JA
KO
LT
NL
NO
PT
RO
RU
TR
ZH
© kzen.dev 2023
Sursă
stackoverflow.com
în cadrul licenței cc by-sa 3.0 cu atribuire