سؤال

أنا جديد ج #ابق). عندما يكون لدي بعض الكود مثل ما يلي:

class Employee
{
    // some code
}


class Manager : Employee
{
    //some code
}

السؤال رقم 1: إذا كان لدي رمز آخر يفعل هذا:

   Manager mgr = new Manager();
   Employee emp = (Employee)mgr;

هنا Employee هو Manager, ، ولكن عندما ألقي ذلك مثل ذلك إلى Employee وهذا يعني أنني محض في ذلك؟

السؤال 2:

عندما يكون لدي العديد Employee كائنات الطبقة وبعضها ولكن ليس كلها Manager، كيف يمكنني أن أضعها في أي مكان ممكن؟

هل كانت مفيدة؟

المحلول

  1. هذا صحيح. عند القيام بذلك، تقوم بإلقاء ذلك employee كائن، بحيث لا يمكنك الوصول إلى أي شيء محدد.

  2. حيث يمكنك تناول فئة أساسية ثم حاول تشغيلها إلى فئة أكثر تحديدا. يمكن أن يتحقق هذا مع استخدامه هو ومضخة صريحة مثل هذا:

    if (employee is Manager)
    {
        Manager m = (Manager)employee;
        //do something with it
    }
    

أو مع as مشغل مثل هذا:

Manager m = (employee as Manager);
if (m != null)
{
    //do something with it
}

إذا كان أي شيء غير واضح، سأكون سعيدا بتصحيحه!

نصائح أخرى

مبحث (استخدام (Employee)someInstance) سهلا عموما حيث يمكن للمترجم أن يخبرك بتجميع الوقت إذا تم استخلاص نوع من آخر.

Downcasting. ومع ذلك يجب القيام به في وقت التشغيل بشكل عام حيث قد لا يعرف التحويل البرمجي دائما ما إذا كان المثال المعني من النوع المعطى. C # يوفر اثنين من المشغلين لهذا - هو الذي يخبرك إذا كان يعمل الوصف، والعودة TRUE / FALSE. و مثل الذي يحاول القيام به الوكيل وإرجاع النوع الصحيح إذا كان ذلك ممكنا، أو لاغيا إذا لم يكن كذلك.

لاختبار ما إذا كان الموظف مدير:

Employee m = new Manager();
Employee e = new Employee();

if(m is Manager) Console.WriteLine("m is a manager");
if(e is Manager) Console.WriteLine("e is a manager");

يمكنك أيضا استخدام هذا

Employee someEmployee = e  as Manager;
    if(someEmployee  != null) Console.WriteLine("someEmployee (e) is a manager");

Employee someEmployee = m  as Manager;
    if(someEmployee  != null) Console.WriteLine("someEmployee (m) is a manager");
  • مبحث هي عملية تقوم بإنشاء مرجع فئة أساسية من مرجع فرعي. (الفئة الفرعية -> superclass) (IE Manager -> الموظف)
  • Downcasting. هي عملية تقوم بإنشاء مرجع فرعي من مرجع فئة أساسية. (SuperClass -> الفئة الفرعية) (أي الموظف -> مدير)

في حالتك

Employee emp = (Employee)mgr; //mgr is Manager

أنت تقوم بعملية بحثية.

تنجح عملية فعل دائما على عكس العمود المتقدم الذي يتطلب وضع صريح لأنه يمكن أن يفشل في وقت التشغيل. (InvalidcastException.).

يقدم C # من المشغلين لتجنب هذا الاستثناء الذي يتم طرحه:

بدءا من:

Employee e = new Employee();

أولاً:

Manager m = e as Manager; // if downcast fails m is null; no exception thrown

ثانية:

if (e is Manager){...} // the predicate is false if the downcast is not possible 

تحذير: عند القيام برمجية، يمكنك فقط الوصول إلى طرق Superclass "الخصائص، إلخ ...

في حال كنت بحاجة إلى التحقق من كل من كائن الموظف سواء كان كائن مدير، استخدم طريقة oftype:

List<Employee> employees = new List<Employee>();

//Code to add some Employee or Manager objects..

var onlyManagers = employees.OfType<Manager>();

foreach (Manager m in onlyManagers) {
  // Do Manager specific thing..
}

الإجابة 1: نعم يسمى Opcasting ولكن الطريقة التي تفعل بها أنها ليست طريقة حديثة. يمكن إجراء عملية البحث ضمنيا، لا تحتاج إلى أي تحويل. حتى مجرد كتابة الموظف EMP = MGR؛يكفي للبحث.

الإجابة 2: إذا قمت بإنشاء كائن من فئة المدير، فيمكننا نقول أن المدير هو موظف. لان مدير الفصل: الموظف يصور هي علاقة بين فئة الموظفين والدير. حتى نتمكن من القول أن كل مدير هو موظف.

ولكن إذا نجحنا كائن من فئة الموظف، لا يمكننا أن نقول أن هذا الموظف هو مدير ل موظف فئة هي فئة غير مورثة أي فئة أخرى. لذلك لا يمكنك الوصول مباشرة إلى كائن فئة الموظف إلى كائن فئة Manager.

إذن الإجابة، إذا كنت ترغب في الوصول إلى كائن فئة الموظف إلى كائن فئة Manager، أولا يجب أن يكون لديك كائن من فئة Manager أولا، ثم يمكنك إتمامه ثم يمكنك بلوغها.

التحضير والتطبيقات:

التحضير: صب من الطبقة المشتقة إلى قاعدة الطبقة الأساسية: صب من الطبقة الأساسية إلى فئة مشتقة

دعونا نفهم نفس مثال:

ضع في اعتبارك شكل فئتين كطبقة الأصل والدائرة كطبقة مشتقة، معتمدة على النحو التالي:

class Shape
{
    public int Width { get; set; }
    public int Height { get; set; }
}

class Circle : Shape
{
    public int Radius { get; set; }
    public bool FillColor { get; set; }
}

التحضير:

شكل S = شكل جديد ()؛

دائرة c = s؛

تشير كل من C و S إلى نفس موقع الذاكرة، ولكن كلاهما يحتوي على وجهات نظر مختلفة، أي باستخدام "C" المرجع الذي يمكنك الوصول إليه بجميع خصائص الفصل الأساسي والفئة المشتقة أيضا، ولكن باستخدام مرجع "S" يمكنك الوصول إلى الخصائص من الطبقة الأصل الوحيدة.

مثال عملي للبحث عن فئة دفق وهو BaseClass من جميع أنواع قارئ دفق .NET Framework:

قارئ StreamReader = StreamReader جديد (جديد FileStreamreader () جديد)؛

هنا، FileStreamReader () مبحث إلى Streadm REDER.

من خلال:

شكل S = دائرة جديدة ()؛ هنا كما هو موضح أعلاه، عرض S هو الوالد الوحيد، من أجل جعله من الوالدين والطفل الذي نحتاج إليه

فار c = (دائرة)؛

المثال العملي ل DownCasting هو فئة زر WPF.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top