मुझे यकीन नहीं है कि यह सी # के साथ संभव है, लेकिन क्या किसी वर्ग के उदाहरण से संबंधित किसी विशेषता में जानकारी संग्रहीत करना संभव है?

तो, मेरे पास Initialized फ़ील्ड के साथ निम्न वर्ग है, जैसा कि यहां देखा गया है:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class GameObjectAttribute : Attribute {
  internal bool Initialized = false;
}

मैं तब कक्षा में विशेषता जोड़ने के लिए इसका उपयोग करता हूं:

[GameObject]
public class Player {

}

अब, इस वर्ग में, इस छद्म कोड की तरह वर्ग के प्रत्येक व्यक्तिगत उदाहरण के लिए विशेषता में डेटा को संशोधित करना संभव है:

internal class Core {
  async void Tick() {
    while (isRunning) {
      foreach (var gameObject in gameObjects) {
        // Get attribute information
        var refToAttribute = gameObject.... // Somehow get information
        if (!refToAttribute.Initialized) {
          // Do some stuff
          refToAttribute.Initialized = true;
        }
      }
      await Task.Delay(1);
    }
  }
}

संपादित करें

टाइपस्क्रिप्ट की दुनिया से आने पर, जब क्लास बनाई जाती है तो मैं क्लास का एक नया इंस्टेंस वापस कर सकता हूं:

export function GameObject() {
  return function (constructor: T) {
    return class extends constructor {
      initialized = false;
    }
  }
}

@GameObject
export class Player {
}

तो अब, मेरे लूप में मेरे पास instance तक पहुंच है, हालांकि Player की पहुंच नहीं है।

c#
0
Get Off My Lawn 4 सितंबर 2021, 00:15

3 जवाब

सबसे बढ़िया उत्तर

अब, इस वर्ग में, कक्षा के प्रत्येक व्यक्तिगत उदाहरण के लिए विशेषता में डेटा को संशोधित करना संभव है

नहीं, विशेषताएँ वर्ग से जुड़ी हैं, उक्त वर्ग के उदाहरणों से नहीं। विशेषता का केवल एक उदाहरण है और वह उदाहरण वर्ग Player से जुड़ा हुआ है। आप प्लेयर इंस्टेंस से एट्रीब्यूट को एक्सेस कर सकते हैं, लेकिन केवल उन एट्रिब्यूट्स को देखकर जो टाइप से जुड़ी हुई हैं। तो यह वास्तव में ऐसा कुछ भी नहीं है जिसका उपयोग आप किसी विशेष खिलाड़ी उदाहरण के लिए अतिरिक्त जानकारी प्रदान करने के लिए कर सकते हैं।

स्थिर रूप से टाइप की गई भाषा में आप क्या कर सकते हैं मूल्य को लपेटना है। ऐसा कुछ हासिल करेगा जो आप करने की कोशिश कर रहे हैं:

public class PlayerGameObject
{
    public bool IsInitialized { get; set; }
    public Player Player { get; set; }
}

// …
foreach (var gameObject in gameObjects)
{
    if (!gameObject.IsInitialized)
    {
        var player = gameObject.Player;

        // do some stuff
        gameObject.IsInitialized = true;
    }
}
1
poke 3 सितंबर 2021, 22:06

क्या किसी वर्ग के उदाहरण से संबंधित किसी विशेषता में जानकारी संग्रहीत करना संभव है?

नहीं, गुण वर्ग की परिभाषा का हिस्सा हैं, इसके उदाहरण नहीं। यह उसी कारण से असंभव है कि एक वर्ग के एक उदाहरण के लिए एक विधि सार्वजनिक नहीं हो सकती है लेकिन उसी वर्ग के दूसरे उदाहरण के लिए निजी हो सकती है।

किसी वर्ग के उदाहरण के बारे में जानकारी केवल उसके क्षेत्रों और गुणों में संग्रहीत की जा सकती है।

1
Scott Hannen 3 सितंबर 2021, 21:54

मेरा सुझाव है कि आप इसके बजाय बेस क्लास का उपयोग करें।

//Your framework
abstract class GameObject
{
    internal bool Initialized { get; set; } = false;
}


//Inside program that uses the framework
class Player : GameObject
{
}

अब Player वर्ग के पास ऐसी संपत्ति है, जिसे केवल आपका कोड ही एक्सेस कर सकता है।

//Your framework
void Initialize(GameObject obj)
{
    if (!obj.Initialized)
    {
        //Do something
        obj.Initialized = true;
    }
}

//Inside program that uses the framework
var player = new Player();
if (player.Initialized) //Compile-time error
1
John Wu 3 सितंबर 2021, 22:52