C # для передачи типа класса в базовый конструктор - PullRequest
0 голосов
/ 01 июня 2019

Ну, это запутанный / сложный вопрос, и вот он:

  • У меня есть две пары классов
    • Derived наследует классиз Base класса (class Derived: Base{})
    • Class2 наследуется от Class1 (class Class2: Class1 {})

Мой текущий Class1Конструктор имеет:

Derived d = new Derived();

Я хочу, чтобы тип Derived передавался из конструктора Class2 в его базовый (Class1) конструктор.Это возможно?

Более полный код:

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");  
    }  
}  

Т.е. от base(a, b, Derived1) Я хочу перейти от Class2 к конструктору / определению, какой тип Class1 будет новым, будь то Derived1 или Derived2.

Надеюсь, что я разъяснил этот запутанный / сложный вопрос.

1 Ответ

2 голосов
/ 01 июня 2019

Вы также можете использовать ключевое слово typeof, используемое ниже:

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);
}

Или напишите более общую форму, используя C # generics , например:

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);
}

И вывод будет:

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...