Mahmut Koyuncu Ответов: 3

Производный класс инициализируется базовым классом


Привет люди,
У меня есть очень интересный вопрос. инициализация производного класса с его базовым классом.
Я имею в виду, что есть два класса с именами DerivedClass и BaseClass. DerivedClass производный от BaseClass. Я хочу сделать что-то подобное

class DerivedClass
{
   public DerivedClass(BaseClass bc)
   {
        base = bs;
   }
}


разве это возможно?

sinhasourabh

Если вы задаете нам вопросы , я отвечу: "почему бы вам не попробовать это самостоятельно". И если вы проверяете навыки людей, помогающих друг другу, то в этом случае я могу только дать вам подсказку : прочитайте твердый принцип и используйте интерфейс.

BillWoodruff

Это "сумасшедший" вопрос, который путает экземпляр класса с определением класса. Вам нужно взять хорошую книгу и изучить основы C#.

3 Ответов

Рейтинг:
2

saeid mohammad hashem

Вы можете создать конструктор в производном классе и сопоставить объекты или создать метод расширения, подобный этому:


public static class Extensions 
      {            
            public static void FillPropertiesFromBaseClass<T1, T2>(this T2 drivedClass, T1 baseClass) where T2 : T1
            {
                //Get the list of properties available in base class
                System.Reflection.PropertyInfo[] properties = typeof(T1).GetProperties();
    
                properties.ToList().ForEach(property =>
                {
                    //Check whether that property is present in derived class
                    System.Reflection.PropertyInfo isPresent = drivedClass.GetType().GetProperty(property.Name);
                    if (isPresent != null && property.CanWrite)
                    {
                        //If present get the value and map it
                        object value = baseClass.GetType().GetProperty(property.Name).GetValue(baseClass, null);
                        drivedClass.GetType().GetProperty(property.Name).SetValue(drivedClass, value, null);
                    }
                });
            }
      }


например, когда вы должны заниматься вот так:

public class Fruit {
        public float Sugar { get; set; }
        public int Size { get; set; }
    }
    public class Apple : Fruit {
        public int NumberOfWorms { get; set; }
    }




вы можете инициализировать производный класс с помощью этого кода:


//constructor 
    public Apple(Fruit fruit)
    {            
       this.FillPropertiesFromBaseClass(fruit);
    }


Рейтинг:
0

OriginalGriff

Нет, я думаю, ты запутался.

class DerivedClass
{
   public DerivedClass(BaseClass bc)
   {
        base = bs;
   }
}


Ваш "DerivedClass" не связан с "BaseClass" - за исключением объекта, из которого они оба происходят. (Игнорируя опечатку "bs" / "bc")
Вы, скорее всего, хотите сказать::
class DerivedClass : BaseClass
{
   public DerivedClass(BaseClass bc)
   {
        base = bc;
   }
}
Что действительно вытекает из базы. Но в этом случае вам не нужно создавать экземпляр DerivedClass из экземпляра базового класса, потому что производный класс является типом базового класса-он уже содержит все поля, свойства, события и методы базового класса.

То, что у вас есть, в основном является конструктором копирования (что вы можете сделать), но это должно быть неуместно, если остальная часть вашего системного дизайна не является довольно странной.
Лучшим способом закодировать его было бы:
class DerivedClass : BaseClass
    {
    public DerivedClass(BaseClass bc) : base (bc)
        {
        }
    }

Но даже тогда это странная идея.

Что ты пытаешься сделать, если думаешь, что тебе это нужно?


Mahmut Koyuncu

Thanks for response, okey MyBase class a graphic user interface I can lines curves in this class, but somewhere in my project I dont need graph only image of graph so i need some new class GraphShower And Class GraphDrawer is derived by Drawer class. GraphShower and GraphDrawer is in a communication each other. But in somewhere of project I need Drawer images and GraphDrawer and GraphShower do that automatically. İf Drawer class add this properties then Drawer class is out of its purpose. I dont want it so if i make sending Drawer type and copy it to base part of GraphDrawer in some way. BaseClass CopyConstructor is not defined by me, it is defined behind like Default constructor or it must be defined?

Рейтинг:
0

rjrizzuto

Я думаю, что это более актуально:

класс DerivedClass : BaseClass
{
строка someOtherInfo;
общественные DerivedClass(класс до н. э.)
{
базы = до н. э.;
}
}

То есть инициализируйте базовый класс производного класса field for field.

Я не уверен, что это можно сделать в C#. В C++ я думаю, что мог бы сделать *(BasedClass)this = bc;

В C#, я думаю, вы могли бы сделать это:

class DerivedClass : BaseClass
{
   string someOtherInfo;
   public DerivedClass(BaseClass bc) : base(bc)
   {
   }
}


Однако для этого требуется наличие такого конструктора в базовом классе.