简体   繁体   中英

C# to pass class type to base constructor

Well, this is a convoluted /complicated question, and here it goes:

  • I have two pair of classes
    • Derived class inherits from the Base class ( class Derived: Base{} )
    • Class2 inherits from Class1 ( class Class2: Class1 {} )

My current Class1 constructor has:

Derived d = new Derived();

What I want is that the type Derived is passed from the Class2 constructor into its base ( Class1 ) constructor. Is that possible?

More complete code:

class Base   
{  
    public Base() {  
        Console.WriteLine("Inside Base Constructor");  
    }
    ~Base() {  
        Console.WriteLine("Inside Base Destructor");  
    }  
}  

class Derived1: Base {  
    public Derived1() {  
        Console.WriteLine("Inside The Derived1 Constructor");  
    }
    ~Derived1() {  
        Console.WriteLine("Inside The Derived1 Destructor");  
    }  
}

class Derived2: Base {  
    public Derived2() {  
        Console.WriteLine("Inside The Derived2 Constructor");  
    }
    ~Derived2() {  
        Console.WriteLine("Inside The Derived2 Destructor");  
    }  
}

class Class1  
{  
    protected int a, b;  
    public Class1() {  
        a = 0;  
        b = 0;  
        Derived1 obj=new Derived1();
        Console.WriteLine("Inside base class default constructor");  
    }  
    public Class1(int a, int b, Derived1) {  
        this.a = a;  
        this.b = b;  
        Derived1 obj=new Derived1();
        Console.WriteLine("Inside base class parameterized constructor");  
    }  
}  
class Class2: Class1 {  
    int c;  
    public Class2(int a, int b, int c): base(a, b, Derived1) {  
        this.c = c;  
        Console.WriteLine("Inside derived class parametrized constructor");  
    }  
}  

Ie, by base(a, b, Derived1) I want to pass from Class2 constructor/definition, what type Class1 will new, whether it is Derived1 or Derived2 .

Hope that I've made this convoluted /complicated question clear.

You can also use the typeof keyword used below:

class Class2 : Class1
{
    int c;
    public Class2(int a, int b, int c) : base(a, b, typeof(Derived1))
    {
        this.c = c;
        Console.WriteLine("Inside derived class parametrized constructor");
    }
}

void Main()
{
    Class2 c2 = new Class2(1,2, 3);
}

Or write more generic form using C# generics like this:

class Class1<T> where T: new()
{
    protected int a, b;
    public Class1()
    {
        a = 0;
        b = 0;
        T obj = new T();
        Console.WriteLine("Inside base class parameterized constructor, with {0}", typeof (T));
    }

    public Class1(int a, int b)
    {
        this.a = a;
        this.b = b;
        T obj = new T();
        Console.WriteLine("Inside base class parameterized constructor");
    }
}

class Class2<T> : Class1<T> where T: new()
{
    int c;
    public Class2(int a, int b, int c) : base(a, b)
    {
        this.c = c;
        Console.WriteLine("Inside derived class parametrized constructor");
    }
}


void Main()
{
    var c2 = new Class2<Derived1>(1, 2, 3);
    Console.WriteLine("-----");
    var c2_2 = new Class2<Derived2>(1, 2, 3);
}

And the output will be:

Inside Base Constructor
Inside The Derived1 Constructor
Inside base class parameterized constructor, with Derived1
Inside derived class parametrized constructor
-----
Inside Base Constructor
Inside The Derived2 Constructor
Inside base class parameterized constructor, with Derived2
Inside derived class parametrized constructor

I hope this help.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM