Ushbu kodni qayta ishlashga qanday murojaat qilish kerak (C #, Types)

Birinchidan, savolning sarlavhasi uchun uzr so'rayman. Men buni amalga oshirishga harakat qilaman deyishimga ishonchim komil emas, shuning uchun men uni to'g'ridan-to'g'ri ayta olaman.

Hozirda C# yordamida GDI + bilan o'yin mexanizmi ishlab chiqyapman va komponentlar sinfini tatbiq qildim. Fikr har qanday o'yin obyekti unga biriktirilgan bir necha qismlarga ega bo'lishi mumkin (Unity3D kabi) va har qanday turdagi komponentni topib olishni xohlayman.

Ushbu qaydda ushbu kodni o'zgartirishni xohlayman:

Rigidbody r = obj.GetComponentOfType(typeof(Rigidbody)) as Rigidbody;

Shu o'rniga bunga o'xshash:

Rigidbody r = obj.GetComponentOfType();

Buni qanday qilishim mumkin?

Kechirasiz, mening savolim noaniq bo'lib qolsa, bu mavzu bo'yicha har qanday yorug'lik ajoyib bo'lardi!

4
qo'shib qo'ydi muallif lordkain, manba

8 javoblar

Bunga umumiy usul deyiladi. Mavjud turdagi dasturni quyidagi tarzda chaqiradigan ortiqcha yuk yaratishingiz mumkin:

public T GetComponentOfType()
{
    return (T) GetComponentOfType(typeof(T));
}
6
qo'shib qo'ydi

Assuming you have a List field in your obj's type. You can use Linq :

// assuming
public class GameObject
{
    List m_Components;//all components attached to this GameObject
    public TComponent GetComponentOfType()
        where TComponent : Component
    {
       //Select only the ones of type TComponent and return first one
        return m_Components.OfType().FirstOrDefault();
    }
}

To use this : obj.GetComponentOfType();

3
qo'shib qo'ydi

Agar sinfni o'zgartira olmasangiz kengaytma usuli foydalanishingiz mumkin:

public static T GetComponentOfType(this [objType] obj)
where T : class
{
    return obj.GetComponentOfType(typeof(T)) as T;
}
1
qo'shib qo'ydi

Menimcha, quyidagi umumiy usulni amalga oshirishni xohlaysiz:

using System.Linq;
using System.Collections.Generic;

/// 
/// Base-Class ///
 
public abstract class Thing
{
    private ICollection<thing> _things;

    public Thing()
    {
        _things = new List<thing>();
    }

    public void AddSomething(Thing toAdd)
    {
        _things.Add(toAdd);
    }

    /// 
/// Assuming that every type can only appear once ///
 
    /// 
    /// 
    public T GetComonentOfType() where T : Thing
    {
        return this.GetComonentOfType(typeof(T)) as T;
    }

    public Thing GetComonentOfType(Type t)
    {
        return _things.Where(x => x.GetType() == t).Single();
    }

}

/// 
/// One possible implementation ///
 
public class SpecialThing : Thing
{

}
1
qo'shib qo'ydi

Barcha komponent sinflari ushbu klassni egallasa (yoki shunga o'xshash):

public abstract class IComponent
{
    protected IList objComponents;

    public object GetComponentOfType(Type type)
    {
        if (objComponents == null)
            return null;

        return objComponents.Where(obj => obj.GetType() == type).FirstOrDefault();
    }
}

Sizdan meros olish uchun boshqa asosiy ona sinfini yaratishingiz mumkin:

public abstract class BaseComponent : IComponent
{
    public object GetComponentOfType()
    {
        return GetComponentOfType(typeof(T));
    }
}

Yoki agar siz birinchi sinfga kirsangiz, oldingi funksiyani unga qo'shing.

0
qo'shib qo'ydi

Bu generics yordamida amalga oshiriladi. GetComponentofType usuli tanasi deyarli bir xil bo'ladi, faqat farq siz istagan turini umumiy parametr sifatida o'tkazmasdan emas, balki umumiy orqali aniqlaydi.

Usul quyidagicha bo'lishi mumkin:

 public T GetComponentOfType(){

      //code goes here to locate the object.
      you can get the type via typeof(T) 

      return theObject;
 }
0
qo'shib qo'ydi

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

   public class Rigidbody{
        public int Size{ get; set; }
        public string fourgroundColor{ get; set; }
        public string backgroundColor{ get; set; }
        public int fingerammount{ get; set; }
        public int arms{ get; set; }
    }
</div> </div>

Rigidbody ismli bir sinf yaratmoq. Barcha komponentlarni sinfga qo'ying, undan foydalanishingiz mumkin. Olso uni omma e'tiboriga havola qiladi, aks holda siz uni namuna kabi ishlata olmaysiz.

sinfga ega bo'lganda siz quyidagilarni aytishingiz mumkin: var r = obj.GetComponentOfType (); ma'lumotlar turi o'rniga mavjud emas. Var oldindan yaxshi ma'lumotlar turi (c # 1 yoki C2.0 kabi), men har doim bir xil xato qildim. Lekin men sofware ishlab chiquvchisi sifatida ishlay boshladim, ular menga (men hali ham kichik, olmos mediator)

0
qo'shib qo'ydi
IMO bu javob hech qanday ma'noga ega emas. OP o'z tarkibiy qismini chiqarish uchun umumiy usulni yaratish haqida so'radi va siz derleme vaqtini aniqlangan usul haqida yozyapsiz.
qo'shib qo'ydi muallif m.rogalski, manba

Add an extension method to the GetComponentOfType method which does the dirty work for you (the first line of code you posted) and have it accept a generic type. You can then pass in the Rigidbody type in <> tags.

Kengaytma usullari haqida qo'shimcha ma'lumot olish uchun bu erda yozing.

Tartibga solish: kengaytma usulingizning statik ekanligiga ishonch hosil qiling.

Umid qilamanki yordam beradi.

0
qo'shib qo'ydi