टाइप इंट्रोस्पेक्शन
![]() | CollapseThis article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages)
(Learn how and when to remove this template message)
|
कम्प्यूटिंग में, टाइप इंट्रोस्पेक्शन एक प्रोग्राम की डेटा प्रकार या किसी वस्तु (कंप्यूटर विज्ञान) के गुणों की 'जांच' करने की क्षमता है। रन टाइम पर (कार्यक्रम जीवनचक्र चरण)। कुछ प्रोग्रामिंग भाषाओं में यह क्षमता होती है।
आत्मनिरीक्षण को प्रतिबिंब (कंप्यूटर प्रोग्रामिंग) के साथ भ्रमित नहीं होना चाहिए, जो एक कदम आगे जाता है और एक कार्यक्रम के लिए रनटाइम पर किसी वस्तु के मूल्यों, मेटाडेटा, गुणों और कार्यों में 'हेरफेर' करने की क्षमता है। कुछ प्रोग्रामिंग भाषाओं में भी वह क्षमता होती है (जैसे, जावा (प्रोग्रामिंग भाषा), पायथन (प्रोग्रामिंग भाषा), जूलिया (प्रोग्रामिंग भाषा), और जाओ (प्रोग्रामिंग_भाषा))।
उदाहरण
रूबी
टाइप इंट्रोस्पेक्शन रूबी (प्रोग्रामिंग भाषा) की एक प्रमुख विशेषता है। रूबी में, ऑब्जेक्ट क्लास (प्रत्येक वर्ग का पूर्वज) प्रदान करता है Object#instance_of?
और Object#kind_of?
इंस्टेंस की क्लास चेक करने के तरीके। उत्तरार्द्ध सच हो जाता है जब संदेश भेजा गया विशेष उदाहरण प्रश्न में कक्षा के वंशज का उदाहरण होता है। उदाहरण के लिए, निम्नलिखित उदाहरण कोड पर विचार करें (आप इंटरएक्टिव रूबी शैल के साथ इसे तुरंत आज़मा सकते हैं):
$ irb
irb(main):001:0> A=Class.new
=> A
irb(main):002:0> B=Class.new A
=> B
irb(main):003:0> a=A.new
=> #<A:0x2e44b78>
irb(main):004:0> b=B.new
=> #<B:0x2e431b0>
irb(main):005:0> a.instance_of? A
=> true
irb(main):006:0> b.instance_of? A
=> false
irb(main):007:0> b.kind_of? A
=> true
उपरोक्त उदाहरण में, {{code|Class}रूबी में किसी अन्य वर्ग के रूप में } वर्ग का उपयोग किया जाता है। दो वर्ग बनाए गए हैं, A
और B
, पूर्व बाद वाले का सुपरक्लास है, फिर प्रत्येक वर्ग के एक उदाहरण की जाँच की जाती है। अंतिम अभिव्यक्ति सत्य देता है क्योंकि A
की कक्षा का एक सुपरक्लास है b
.
इसके अलावा, आप सीधे किसी वस्तु के वर्ग के लिए पूछ सकते हैं, और उनकी तुलना कर सकते हैं (नीचे दिए गए कोड को ऊपर दिए गए कोड को निष्पादित करने के लिए मान लिया गया है):
irb(main):008:0> A.instance_of? Class
=> true
irb(main):009:0> a.class
=> A
irb(main):010:0> a.class.class
=> Class
irb(main):011:0> A > B
=> true
irb(main):012:0> B <= A
=> true
उद्देश्य-सी
उद्देश्य सी में, उदाहरण के लिए, जेनेरिक ऑब्जेक्ट और एनएसओब्जेक्ट दोनों (कोको (एपीआई)/ओपनस्टेप में) विधि प्रदान करते हैं (कंप्यूटर विज्ञान) isMemberOfClass:
जो सत्य लौटाता है यदि विधि का तर्क निर्दिष्ट वर्ग का एक उदाहरण है। प्रक्रिया isKindOfClass:
यदि निर्दिष्ट वर्ग से तर्क प्राप्त होता है तो समान रूप से सत्य लौटाता है।
उदाहरण के लिए, कहें कि हमारे पास एक है Apple
और एक Orange
वर्ग से विरासत में मिला Fruit
.
अब, में eat
विधि हम लिख सकते हैं
- (void)eat:(id)sth {
if ([sth isKindOfClass:[Fruit class]]) {
// we're actually eating a Fruit, so continue
if ([sth isMemberOfClass:[Apple class]]) {
eatApple(sth);
} else if ([sth isMemberOfClass:[Orange class]]) {
eatOrange(sth);
} else {
error();
}
} else {
error();
}
}
अब जब eat
को एक सामान्य वस्तु के साथ कहा जाता है (an id
), सामान्य वस्तु के प्रकार के आधार पर फ़ंक्शन सही ढंग से व्यवहार करेगा।
सी ++
C++ रन-टाइम प्रकार की जानकारी (RTTI) टाइपिड और डायनामिक_कास्ट कीवर्ड के माध्यम से प्रकार के आत्मनिरीक्षण का समर्थन करता है। dynamic_cast}st
अभिव्यक्ति का उपयोग यह निर्धारित करने के लिए किया जा सकता है कि कोई विशेष वस्तु किसी विशेष व्युत्पन्न वर्ग की है या नहीं। उदाहरण के लिए:
Person* p = dynamic_cast<Person *>(obj);
if (p != nullptr) {
p->walk();
}
typeid}आईडी
ऑपरेटर एक पुनर्प्राप्त करता हैstd::type_info
किसी वस्तु के सबसे व्युत्पन्न प्रकार का वर्णन करने वाली वस्तु:
if (typeid(Person) == typeid(*obj)) {
serialize_person( obj );
}
वस्तु पास्कल
डेल्फी के मूल रिलीज के बाद से टाइप इंट्रोस्पेक्शन ऑब्जेक्ट पास्कल का एक हिस्सा रहा है, जो विजुअल फॉर्म डिजाइन के लिए आरटीटीआई का भारी उपयोग करता है। ऑब्जेक्ट पास्कल में, सभी वर्ग बेस टॉब्जेक्ट क्लास से उतरते हैं, जो बुनियादी आरटीटीआई कार्यक्षमता को लागू करता है। आरटीटीआई उद्देश्यों के लिए प्रत्येक वर्ग के नाम को कोड में संदर्भित किया जा सकता है; वर्ग नाम पहचानकर्ता को वर्ग के मेटाडेटा के सूचक के रूप में कार्यान्वित किया जाता है, जिसे घोषित किया जा सकता है और TClass प्रकार के चर के रूप में उपयोग किया जा सकता है। भाषा में is ऑपरेटर शामिल है, यह निर्धारित करने के लिए कि कोई ऑब्जेक्ट किसी दिए गए वर्ग से है या उतरता है, ऑपरेटर के रूप में, टाइप-चेक टाइपकास्ट प्रदान करता है, और कई टॉब्जेक्ट विधियां। गहरा आत्मनिरीक्षण (क्षेत्रों और विधियों की गणना) पारंपरिक रूप से केवल $M+ (एक प्राग्मा) स्थिति में घोषित वस्तुओं के लिए समर्थित है, आमतौर पर TPersistent, और केवल प्रकाशित अनुभाग में परिभाषित प्रतीकों के लिए। डेल्फ़ी 2010 ने इसे लगभग सभी प्रतीकों तक बढ़ा दिया।
procedure Form1.MyButtonOnClick(Sender: TObject);
var
aButton: TButton;
SenderClass: TClass;
begin
SenderClass := Sender.ClassType; //returns Sender's class pointer
if sender is TButton then
begin
aButton := sender as TButton;
EditBox.Text := aButton.Caption; //Property that the button has but generic objects don't
end
else begin
EditBox.Text := Sender.ClassName; //returns the name of Sender's class as a string
end;
end;
जावा
जावा में प्रकार आत्मनिरीक्षण का सबसे सरल उदाहरण है instanceof
[1] ऑपरेटर। instanceof}of
ऑपरेटर यह निर्धारित करता है कि क्या कोई विशेष वस्तु किसी विशेष वर्ग (या उस वर्ग के उपवर्ग, या उस इंटरफ़ेस को लागू करने वाले वर्ग) से संबंधित है। उदाहरण के लिए:
if (obj instanceof Person) {
Person p = (Person)obj;
p.walk();
}
java.lang.Class}एसएस
[2] वर्ग अधिक उन्नत आत्मनिरीक्षण का आधार है।
उदाहरण के लिए, यदि किसी वस्तु के वास्तविक वर्ग को निर्धारित करना वांछनीय है (बजाय इसके कि क्या वह किसी विशेष वर्ग का सदस्य है), Object.getClass()
और Class.getName()
इस्तेमाल किया जा सकता है:
System.out.println(obj.getClass().getName());
पीएचपी
PHP में आत्मनिरीक्षण का उपयोग करके किया जा सकता है instanceof
ऑपरेटर। उदाहरण के लिए:
if ($obj instanceof Person) {
// Do whatever you want
}
पर्ल
के प्रयोग से आत्मनिरीक्षण किया जा सकता है ref
और isa
पर्ल में कार्य करता है।
हम निम्नलिखित वर्गों और उनके संबंधित उदाहरणों का आत्मनिरीक्षण कर सकते हैं:
package Animal;
sub new {
my $class = shift;
return bless {}, $class;
}
package Dog;
use base 'Animal';
package main;
my $animal = Animal->new();
my $dog = Dog->new();
का उपयोग कर:
print "This is an Animal.\n" if ref $animal eq 'Animal';
print "Dog is an Animal.\n" if $dog->isa('Animal');
मेटा-ऑब्जेक्ट प्रोटोकॉल
मूस (पर्ल) ऑब्जेक्ट सिस्टम का उपयोग करके पर्ल में अधिक शक्तिशाली आत्मनिरीक्षण प्राप्त किया जा सकता है[3] और यह Class::MOP
मेटा-वस्तु प्रोटोकॉल;[4] उदाहरण के लिए, आप जाँच सकते हैं कि क्या दी गई वस्तु कोई भूमिका करती है (कंप्यूटर विज्ञान) X:
if ($object->meta->does_role("X")) {
# do something ...
}
इस प्रकार आप उन सभी विधियों के पूरी तरह से योग्य नामों को सूचीबद्ध कर सकते हैं जिन्हें ऑब्जेक्ट पर लागू किया जा सकता है, साथ ही उन कक्षाओं के साथ जिनमें उन्हें परिभाषित किया गया था:
for my $method ($object->meta->get_all_methods) {
print $method->fully_qualified_name, "\n";
}
पायथन
पायथन (प्रोग्रामिंग लैंग्वेज) में आत्मनिरीक्षण का सबसे आम तरीका उपयोग कर रहा है dir
किसी वस्तु की विशेषताओं का विवरण देने के लिए कार्य करता है। उदाहरण के लिए:
class Foo:
def __init__(self, val):
self.x = val
def bar(self):
return self.x
>>> dir(Foo(5))
['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__',
'__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__str__', '__weakref__', 'bar', 'x']
इसके अलावा, अंतर्निहित कार्य type
और isinstance
का उपयोग यह निर्धारित करने के लिए किया जा सकता है कि वस्तु क्या है hasattr
यह निर्धारित कर सकता है कि कोई वस्तु क्या करती है। उदाहरण के लिए:
>>> a = Foo(10)
>>> b = Bar(11)
>>> type(a)
<type 'Foo'>
>>> isinstance(a, Foo)
True
>>> isinstance(a, type(a))
True
>>> isinstance(a, type(b))
False
>>> hasattr(a, 'bar')
True
ActionScript (as3)
एक्शनस्क्रिप्ट में, function flash.utils.getQualifiedClassName
मनमानी वस्तु के वर्ग/प्रकार के नाम को पुनर्प्राप्त करने के लिए उपयोग किया जा सकता है।
// all classes used in as3 must be imported explicitly
import flash.utils.getQualifiedClassName;
import flash.display.Sprite;
// trace is like System.out.println in Java or echo in PHP
trace(flash.utils.getQualifiedClassName("I'm a String")); // "String"
trace(flash.utils.getQualifiedClassName(1)); // "int", see dynamic casting for why not Number
trace(flash.utils.getQualifiedClassName(new flash.display.Sprite())); // "flash.display.Sprite"
वैकल्पिक रूप से, ऑपरेटर is
यह निर्धारित करने के लिए उपयोग किया जा सकता है कि कोई वस्तु किसी विशिष्ट प्रकार की है या नहीं:
// trace is like System.out.println in Java or echo in PHP
trace("I'm a String" is String); // true
trace(1 is String); // false
trace("I'm a String" is Number); // false
trace(1 is Number); // true
इस दूसरे फ़ंक्शन का उपयोग वंशानुक्रम (वस्तु-उन्मुख प्रोग्रामिंग) माता-पिता के परीक्षण के लिए भी किया जा सकता है:
import flash.display.DisplayObject;
import flash.display.Sprite; // extends DisplayObject
trace(new flash.display.Sprite() is flash.display.Sprite); // true
trace(new flash.display.Sprite() is flash.display.DisplayObject); // true, because Sprite extends DisplayObject
trace(new flash.display.Sprite() is String); // false
मेटा-टाइप आत्मनिरीक्षण
पर्ल की तरह, एक्शनस्क्रिप्ट वर्ग का नाम प्राप्त करने से आगे बढ़ सकता है, लेकिन सभी मेटाडेटा, फ़ंक्शंस और अन्य तत्व जो एक ऑब्जेक्ट का उपयोग करते हैं flash.utils.describeType
समारोह; इसका उपयोग एक्शनस्क्रिप्ट में प्रतिबिंब (कंप्यूटर विज्ञान) लागू करते समय किया जाता है।
import flash.utils.describeType;
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;
import flash.display.Sprite;
var className:String = getQualifiedClassName(new flash.display.Sprite()); // "flash.display.Sprite"
var classRef:Class = getDefinitionByName(className); // Class reference to flash.display{{Not a typo|.}}Sprite
// eg. 'new classRef()' same as 'new flash.display.Sprite()'
trace(describeType(classRef)); // return XML object describing type
// same as : trace(describeType(flash.display.Sprite));
यह भी देखें
संदर्भ