म्यूटेटर विधि: Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
[[कंप्यूटर विज्ञान]] में, एक म्यूटेटर विधि एक चर में परिवर्तन को नियंत्रित करने के लिए उपयोग की जाने वाली [[विधि (कंप्यूटर विज्ञान)|विधि]] है। उन्हें व्यापक रूप से सेटर विधियों के रूप में भी जाना जाता है। अक्सर एक सेटर के साथ एक गेट्टर (एक साथ एक्सेसर्स के रूप में भी जाना जाता है) होता है, जो निजी [[सदस्य चर]] का मान लौटाता है। | [[कंप्यूटर विज्ञान]] में, एक '''म्यूटेटर विधि''' एक चर में परिवर्तन को नियंत्रित करने के लिए उपयोग की जाने वाली [[विधि (कंप्यूटर विज्ञान)|विधि]] है। उन्हें व्यापक रूप से सेटर विधियों के रूप में भी जाना जाता है। अक्सर एक सेटर के साथ एक गेट्टर (एक साथ एक्सेसर्स के रूप में भी जाना जाता है) होता है, जो निजी [[सदस्य चर]] का मान लौटाता है। | ||
एनकैप्सुलेशन के सिद्धांत को ध्यान में रखते हुए, म्यूटेटर विधि का उपयोग अक्सर [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] में किया जाता है। इस सिद्धांत के अनुसार, एक वर्ग के सदस्य [[चर (प्रोग्रामिंग)]] को छिपाने और उन्हें अन्य कोड से बचाने के लिए निजी बनाया जाता है, और इसे केवल एक सार्वजनिक सदस्य फ़ंक्शन (म्यूटेटर विधि) द्वारा संशोधित किया जा सकता है, जो पैरामीटर के रूप में वांछित नया मान लेता है, वैकल्पिक रूप से मान्य करता है यह, और निजी सदस्य चर को संशोधित करता है। म्यूटेटर विधियों की तुलना असाइनमेंट [[ऑपरेटर ओवरलोडिंग]] से की जा सकती है लेकिन वे आम तौर पर ऑब्जेक्ट पदानुक्रम के विभिन्न स्तरों पर दिखाई देते हैं। | एनकैप्सुलेशन के सिद्धांत को ध्यान में रखते हुए, म्यूटेटर विधि का उपयोग अक्सर [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] में किया जाता है। इस सिद्धांत के अनुसार, एक वर्ग के सदस्य [[चर (प्रोग्रामिंग)]] को छिपाने और उन्हें अन्य कोड से बचाने के लिए निजी बनाया जाता है, और इसे केवल एक सार्वजनिक सदस्य फ़ंक्शन (म्यूटेटर विधि) द्वारा संशोधित किया जा सकता है, जो पैरामीटर के रूप में वांछित नया मान लेता है, वैकल्पिक रूप से मान्य करता है यह, और निजी सदस्य चर को संशोधित करता है। म्यूटेटर विधियों की तुलना असाइनमेंट [[ऑपरेटर ओवरलोडिंग]] से की जा सकती है लेकिन वे आम तौर पर ऑब्जेक्ट पदानुक्रम के विभिन्न स्तरों पर दिखाई देते हैं। | ||
Line 25: | Line 25: | ||
}}</ref> | }}</ref> | ||
कक्षा के अंदर से म्यूटेटर और एक्सेसर्स वाले पैरामीटर का हेरफेर जहां उन्हें परिभाषित किया जाता है, उन्हें अक्सर कुछ अतिरिक्त विचार की आवश्यकता होती है। कार्यान्वयन के शुरुआती दिनों में, जब इन ब्लॉकों में बहुत कम या कोई अतिरिक्त कोड नहीं होता है, तो इससे कोई फर्क नहीं पड़ता कि निजी इंस्टेंस चर को सीधे एक्सेस किया गया है या नहीं। सत्यापन, क्रॉस-वैलिडेशन, डेटा इंटीग्रिटी चेक, प्रीप्रोसेसिंग या अन्य परिष्कार के रूप में जोड़ा जाता है, सूक्ष्म बग दिखाई दे सकते हैं जहां कुछ आंतरिक पहुंच नए कोड का उपयोग करती है जबकि अन्य स्थानों पर इसे बायपास किया जाता है। | |||
इसमें शामिल अतिरिक्त चरणों के कारण डेटा फ़ील्ड को सीधे लाने या संग्रहीत करने की तुलना में एक्सेसर फ़ंक्शन कम कुशल हो सकते हैं,<ref>{{cite web | इसमें शामिल अतिरिक्त चरणों के कारण डेटा फ़ील्ड को सीधे लाने या संग्रहीत करने की तुलना में एक्सेसर फ़ंक्शन कम कुशल हो सकते हैं,<ref>{{cite web | ||
Line 37: | Line 37: | ||
=== सभा === | === सभा === | ||
student struct | |||
age dd ? | |||
student end .code | |||
student_get_age proc object:DWORD | |||
mov ebx, object | |||
mov eax, student.age[ebx] | |||
ret | |||
student_get_age endp | |||
student_set_age proc object:DWORD, age:DWORD | |||
mov ebx, object | |||
mov eax, age | |||
mov student.age[ebx], eax | |||
ret | |||
student_set_age endp | |||
=== सी === | === सी === | ||
#ifndef _STUDENT_H | |||
#define _STUDENT_H | |||
struct student; /* opaque structure */ | |||
typedef struct student student; | |||
student *student_new(int age, char *name); | |||
void student_delete(student *s); | |||
void student_set_age(student *s, int age); | |||
int student_get_age(student *s); | |||
char *student_get_name(student *s); | |||
#endif | |||
#include <stdlib.h> | |||
#include <string.h> | |||
# | #include "student.h" | ||
struct student { | |||
int age; | |||
char *name; | |||
}; | |||
student *student_new(int age, char *name) { | |||
student *s = malloc(sizeof(student)); | |||
s->name = strdup(name); | |||
s->age = age; | |||
return s; | |||
} | |||
void student_delete(student *s) { | |||
free(s->name); | |||
free(s); | |||
} | |||
# | void student_set_age(student *s, int age) { | ||
# | s->age = age; | ||
} | |||
int student_get_age(student *s) { | |||
return s->age; | |||
}; | } | ||
char *student_get_name(student *s) { | |||
return s->name; | |||
} | |||
#include <stdio.h> | |||
#include "student.h" | |||
} | |||
int main(void) { | |||
student *s = student_new(19, "Maurice"); | |||
char *name = student_get_name(s); | |||
int old_age = student_get_age(s); | |||
} | printf("%s's old age = %i\n", name, old_age); | ||
student_set_age(s, 21); | |||
int new_age = student_get_age(s); | |||
printf("%s's new age = %i\n", name, new_age); | |||
} | student_delete(s); | ||
return 0; | |||
} | |||
} | |||
} | |||
< | |||
all: out.txt; cat $< | |||
out.txt: main; ./$< > $@ | |||
main: main.o student.o | |||
main.o student.o: student.h | |||
clean: ;$(RM) *.o out.txt main | |||
out.txt: | |||
main.o | |||
=== सी ++ === | === सी ++ === | ||
#ifndef STUDENT_H | |||
#define STUDENT_H | |||
#ifndef STUDENT_H | |||
# | #include <string> | ||
# | class Student { | ||
public: | |||
Student(const std::string& name); | |||
const std::string& name() const; | |||
void name(const std::string& name); | |||
private: | |||
std::string name_; | |||
}; | |||
}; | #endif | ||
In file Student.cpp: | |||
# | #include "Student.h" | ||
Student::Student(const std::string& name) : name_(name) { | |||
} | |||
# | |||
const std::string& Student::name() const { | |||
return name_; | |||
} | } | ||
void Student::name(const std::string& name) { | |||
name_ = name; | |||
} | } | ||
} | |||
===सी#=== | ===सी#=== | ||
यह उदाहरण | यह उदाहरण गुणों के सी # विचार को दिखाता है, जो एक विशेष प्रकार के वर्ग सदस्य हैं। जावा के विपरीत, कोई स्पष्ट तरीके परिभाषित नहीं हैं; एक सार्वजनिक 'संपत्ति' में क्रियाओं को संभालने के लिए तर्क होता है। बिल्ट-इन (अघोषित) वेरिएबल <code>value</code> के उपयोग पर ध्यान दें। | ||
public class Student | |||
{ | |||
private string name; | |||
/// <summary> | |||
/// Gets or sets student's name | |||
/// </summary> | |||
public string Name | |||
{ | |||
get { return name; } | |||
set { name = value; } | |||
} | |||
} | |||
बाद के C# संस्करणों (.NET फ्रेमवर्क 3.5 और ऊपर) में, निजी चर घोषित किए बिना, इस उदाहरण को संक्षिप्त रूप में निम्नानुसार किया जा सकता है <code>name</code>. | |||
< | बाद के C# संस्करणों (.NET फ्रेमवर्क 3.5 और ऊपर) में, निजी चर <code>name</code> घोषित किए बिना, इस उदाहरण को निम्नानुसार संक्षिप्त किया जा सकता है। | ||
public class Student | |||
{ | |||
public string Name { get; set; } | |||
} | |||
संक्षिप्त सिंटैक्स का उपयोग करने का अर्थ है कि अंतर्निहित चर अब कक्षा के अंदर से उपलब्ध नहीं है। नतीजतन, संपत्ति का <code>set</code> हिस्सा असाइनमेंट के लिए मौजूद होना चाहिए। एक्सेस को <code>set</code>-विशिष्ट एक्सेस संशोधक के साथ प्रतिबंधित किया जा सकता है। | |||
} | |||
</ | |||
public class Student | |||
{ | |||
public string Name { get; private set; } | |||
} | |||
{ | |||
} | |||
=== सामान्य लिस्प === | === सामान्य लिस्प === | ||
Line 218: | Line 188: | ||
सीएलओएस के पास गुणों की कोई धारणा नहीं है, हालांकि कॉमन लिस्प ऑब्जेक्ट सिस्टम#मेटाओब्जेक्ट प्रोटोकॉल एक्सटेंशन निर्दिष्ट करता है कि स्लॉट के रीडर और लेखक फ़ंक्शन नामों तक पहुंचने के लिए, जिसमें से उत्पन्न होते हैं <code>:accessor</code> विकल्प।<ref name="mop-slot-definitions">{{cite web |url=http://www.lisp.org/mop/concepts.html#slot-definitions |title=MOP: Slot Definitions |accessdate=2011-03-29}}</ref> | सीएलओएस के पास गुणों की कोई धारणा नहीं है, हालांकि कॉमन लिस्प ऑब्जेक्ट सिस्टम#मेटाओब्जेक्ट प्रोटोकॉल एक्सटेंशन निर्दिष्ट करता है कि स्लॉट के रीडर और लेखक फ़ंक्शन नामों तक पहुंचने के लिए, जिसमें से उत्पन्न होते हैं <code>:accessor</code> विकल्प।<ref name="mop-slot-definitions">{{cite web |url=http://www.lisp.org/mop/concepts.html#slot-definitions |title=MOP: Slot Definitions |accessdate=2011-03-29}}</ref> | ||
निम्न उदाहरण इन स्लॉट विकल्पों और डायरेक्ट स्लॉट एक्सेस का उपयोग करके छात्र वर्ग की परिभाषा दिखाता है: | निम्न उदाहरण इन स्लॉट विकल्पों और डायरेक्ट स्लॉट एक्सेस का उपयोग करके छात्र वर्ग की परिभाषा दिखाता है: | ||
(defclass student () | |||
( | ((name :initarg :name :initform "" :accessor student-name) ; student-name is setf'able | ||
(birthdate :initarg :birthdate :initform 0 :reader student-birthdate) | |||
(number :initarg :number :initform 0 :reader student-number :writer set-student-number))) | |||
;; Example of a calculated property getter (this is simply a method) | |||
;; | (defmethod student-age ((self student)) | ||
(defmethod | (- (get-universal-time) (student-birthdate self))) | ||
;; Example of direct slot access within a calculated property setter | |||
;; | (defmethod (setf student-age) (new-age (self student)) | ||
(defmethod ( | (with-slots (birthdate) self | ||
(setf birthdate (- (get-universal-time) new-age)) | |||
new-age)) | |||
;; The slot accessing options generate methods, thus allowing further method definitions | |||
;; | (defmethod set-student-number :before (new-number (self student)) | ||
(defmethod | ;; You could also check if a student with the new-number already exists. | ||
(check-type new-number (integer 1 *))) | |||
=== डी === | === डी === | ||
[[डी (प्रोग्रामिंग भाषा)]] | [[डी (प्रोग्रामिंग भाषा)]] और सेटर फ़ंक्शन सिंटैक्स का समर्थन करता है। भाषा गेट्टर और सेटर वर्ग/संरचना विधियों के संस्करण 2 में <code>@property</code> विशेषता होनी चाहिए।<ref>{{cite web |url=http://dlang.org/function.html |title=Functions - D Programming Language |url-status=live |accessdate=2013-01-13}}</ref><ref>{{cite web|url=http://dlang.org/dstyle.html |title=The D Style |accessdate=2013-02-01}}</ref> | ||
class Student { | |||
private char[] name_; | |||
// Getter | |||
@property char[] name() { | |||
return this.name_; | |||
} | |||
// Setter | |||
@property char[] name(char[] name_in) { | |||
return this.name_ = name_in; | |||
} | |||
} | |||
} | एक <code>Student</code> उदाहरण इस तरह इस्तेमाल किया जा सकता है: | ||
auto student = new Student; | |||
student.name = "David"; // same effect as student.name("David") | |||
auto student_name = student.name; // same effect as student.name() | |||
=== डेल्फी === | === डेल्फी === | ||
यह डेल्फी भाषा में एक साधारण वर्ग है जो एक निजी क्षेत्र तक पहुँचने के लिए सार्वजनिक संपत्ति की अवधारणा को दर्शाता है। | यह डेल्फी भाषा में एक साधारण वर्ग है जो एक निजी क्षेत्र तक पहुँचने के लिए सार्वजनिक संपत्ति की अवधारणा को दर्शाता है। | ||
interface | |||
type | |||
TStudent = class | |||
strict private | |||
FName: string; | |||
procedure SetName(const Value: string); | |||
public | |||
/// <summary> | |||
/// Get or set the name of the student. | |||
/// </summary> | |||
property Name: string read FName write SetName; | |||
end; | |||
// ... | |||
implementation | |||
// ... | |||
procedure TStudent.SetName(const Value: string); | |||
begin | |||
FName := Value; | |||
end; | |||
end. | |||
=== जावा === | === जावा === | ||
एक | एक छात्र का प्रतिनिधित्व करने वाले एक साधारण वर्ग के इस उदाहरण में केवल संग्रहीत नाम के साथ, कोई देख सकता है कि चर नाम निजी है, अर्थात केवल छात्र वर्ग से दिखाई देता है, और "सेटर" और "गेटर" सार्वजनिक हैं, अर्थात् <code>getName()</code>" और "<code>setName(name)</code>" विधियां। | ||
public class Student { | |||
private String name; | |||
public String getName() { | |||
return name; | |||
} | |||
public void setName(String newName) { | |||
name = newName; | |||
} | |||
} | |||
=== जावास्क्रिप्ट === | |||
इस उदाहरण में कंस्ट्रक्टर-फंक्शन स्टूडेंट का उपयोग केवल संग्रहीत नाम वाले छात्र का प्रतिनिधित्व करने वाली वस्तुओं को बनाने के लिए किया जाता है। | |||
function Student(name) { | |||
var _name = name; | |||
this.getName = function() { | |||
return _name; | |||
}; | |||
this.setName = function(value) { | |||
_name = value; | |||
}; | |||
} | |||
या (वेब ब्राउज़रों में एक्सेसर्स को परिभाषित करने के लिए बहिष्कृत तरीके का उपयोग करते हुए | |||
function Student(name) | |||
{ var _name = name; | |||
this.__defineGetter__('name', function() { | |||
return _name; | |||
}); | |||
this.__defineSetter__('name', function(value) { | |||
_name = value; | |||
}); | |||
} | |||
या (वंशानुक्रम और <code>[[ES6]]</code> एक्सेसर सिंटैक्स के लिए प्रोटोटाइप का उपयोग करके | |||
function Student(name){ | |||
this._name = name; | |||
} | |||
Student.prototype = { | |||
get name() { | |||
return this._name; | |||
}, | |||
set name(value) { | |||
this._name = value; | |||
} | |||
} | |||
या (वंशानुक्रम और [[ES6]] एक्सेसर सिंटैक्स के लिए प्रोटोटाइप का उपयोग करके | |||
} | |||
या (प्रोटोटाइप का उपयोग किए बिना): | या (प्रोटोटाइप का उपयोग किए बिना): | ||
var Student = { | |||
get name() { | |||
return this._name; | |||
}, | |||
set name(value) { | |||
this._name = value; | |||
} | |||
}; | |||
}; | या (डिफाइनप्रॉपर्टी का उपयोग करके): | ||
function Student(name){ | |||
या (डिफाइनप्रॉपर्टी का उपयोग करके): | this._name = name; | ||
} | |||
Object.defineProperty(Student.prototype, 'name', { | |||
get: function() { | |||
} | return this._name; | ||
Object.defineProperty(Student.prototype, 'name', { | }, | ||
set: function(value) { | |||
this._name = value; | |||
} | |||
}); | |||
}); | |||
===एक्शनस्क्रिप्ट 3.0=== | ===एक्शनस्क्रिप्ट 3.0=== | ||
package | |||
{ | |||
{ | public class Student | ||
{ | |||
private var _name : String; | |||
public function get name() : String | |||
{ | |||
return _name; | |||
} | |||
public function set name(value : String) : void | |||
{ | |||
_name = value; | |||
} | |||
} | |||
} | |||
} | |||
=== उद्देश्य-सी === | === उद्देश्य-सी === | ||
<code>Ubuntu 12.04</code> पर <code>GNUstep</code> पर काम करने वाले के रूप में मैनुअल रेफरेंस काउंटिंग के साथ पारंपरिक ऑब्जेक्टिव-सी 1.0 सिंटैक्स का उपयोग करना: | |||
@interface Student : NSObject | |||
@ | { | ||
{ | NSString *_name; | ||
} | |||
} | |||
- (NSString *)name; | |||
- ( | - (void)setName:(NSString *)name; | ||
- ( | |||
@end | |||
@ | |||
@implementation Student | |||
@ | |||
- (NSString *)name | |||
- ( | { | ||
{ | return _name; | ||
} | |||
} | |||
- (void)setName:(NSString *)name | |||
- ( | { | ||
{ | [_name release]; | ||
_name = [name retain]; | |||
} | |||
} | |||
@end | |||
@ | Mac OS X 10.6, iOS 4 और Xcode 3.2 में उपयोग किए गए नए Objective-C 2.0 सिंटैक्स का उपयोग करते हुए, ऊपर बताए अनुसार समान कोड जनरेट करना: | ||
@interface Student : NSObject | |||
Mac OS X 10.6, | |||
@property (nonatomic, retain) NSString *name; | |||
@ | |||
@end | |||
@ | |||
@implementation Student | |||
@ | |||
@synthesize name = _name; | |||
@ | |||
@end | |||
@synthesize | और OS X 10.8 और iOS 6 से शुरू करते हुए, <code>Xcode 4.4</code> और ऊपर का उपयोग करते हुए, सिंटैक्स को और भी सरल बनाया जा सकता है: | ||
@interface Student : NSObject | |||
@ | |||
@property (nonatomic, strong) NSString *name; | |||
और OS X 10.8 और | |||
@end | |||
@ | |||
@implementation Student | |||
@ | |||
//Nothing goes here and it's OK. | |||
@ | |||
@end | |||
@ | |||
// | |||
@ | |||
=== पर्ल === | === पर्ल === | ||
package Student; | |||
sub new { | |||
bless {}, shift; | |||
} | |||
} | |||
sub set_name { | |||
my $self = shift; | |||
$self->{name} = $_[0]; | |||
} | |||
} | |||
sub get_name { | |||
my $self = shift; | |||
return $self->{name}; | |||
} | |||
} | |||
1; | |||
1; | |||
या, कक्षा :: एक्सेसर का उपयोग करना | या, कक्षा :: एक्सेसर का उपयोग करना | ||
package Student; | |||
use base qw(Class::Accessor); | |||
__PACKAGE__->follow_best_practice; | |||
Student->mk_accessors(qw(name)); | |||
1; | |||
1; | या, [[मूस (पर्ल)]] ऑब्जेक्ट सिस्टम का उपयोग करना: | ||
package Student; | |||
use Moose; | |||
या, [[मूस (पर्ल)]] का उपयोग करना: | |||
# Moose uses the attribute name as the setter and getter, the reader and writer properties | |||
# allow us to override that and provide our own names, in this case get_name and set_name | |||
has 'name' => (is => 'rw', isa => 'Str', reader => 'get_name', writer => 'set_name'); | |||
# | 1; | ||
# | |||
1; | |||
=== पीएचपी === | === पीएचपी === | ||
PHP जादू के तरीकों को परिभाषित करती है <code>__get</code>और<code>__set</code> वस्तुओं के गुणों के लिए।<ref>{{Cite web|title=PHP: Overloading - Manual|url=https://www.php.net/manual/en/language.oop5.overloading.php|access-date=2021-07-06|website=www.php.net}}</ref> | PHP जादू के तरीकों को परिभाषित करती है <code>__get</code>और<code>__set</code> वस्तुओं के गुणों के लिए।<ref>{{Cite web|title=PHP: Overloading - Manual|url=https://www.php.net/manual/en/language.oop5.overloading.php|access-date=2021-07-06|website=www.php.net}}</ref> | ||
एक सरल वर्ग (कंप्यूटर विज्ञान) के इस उदाहरण में एक छात्र का प्रतिनिधित्व करने वाला केवल नाम संग्रहीत है, कोई देख सकता है कि चर (प्रोग्रामिंग) नाम निजी है, अर्थात केवल छात्र वर्ग से दिखाई देता है, और सेटर और गेट्टर सार्वजनिक है, अर्थात् <code>getName()</code> और <code>setName('name')</code> तरीके। | एक सरल वर्ग (कंप्यूटर विज्ञान) के इस उदाहरण में एक छात्र का प्रतिनिधित्व करने वाला केवल नाम संग्रहीत है, कोई देख सकता है कि चर (प्रोग्रामिंग) नाम निजी है, अर्थात केवल छात्र वर्ग से दिखाई देता है, और सेटर और गेट्टर सार्वजनिक है, अर्थात् <code>getName()</code> और <code>setName('name')</code> तरीके। | ||
class Student | |||
* @ | { | ||
private string $name; | |||
/** | |||
* @return string The name. | |||
*/ | |||
} | public function getName(): string | ||
{ | |||
return $this->name; | |||
} | |||
/** | |||
* @param string $newName The name to set. | |||
*/ | |||
public function setName(string $newName): void | |||
{ | |||
$this->name = $newName; | |||
} | |||
} | |||
===पायथन=== | ===पायथन=== | ||
यह उदाहरण एक चर, एक गेट्टर और एक सेटर के साथ एक पायथन वर्ग का उपयोग करता है। | यह उदाहरण एक चर, एक गेट्टर और एक सेटर के साथ एक पायथन वर्ग का उपयोग करता है। | ||
class Student: | |||
# Initializer | |||
def __init__(self, name: str) -> None: | |||
# An instance variable to hold the student's name | |||
self._name = name | |||
# Getter method | |||
@property | |||
def name(self): | |||
return self._name | |||
# Setter method | |||
@name.setter | |||
def name(self, new_name): | |||
self._name = new_name | |||
>>> bob = Student("Bob") | |||
>>> bob.name | |||
Bob | |||
>>> bob.name = "Alice" | |||
>>> bob.name | |||
Alice | |||
>>> bob._name = "Charlie" # bypass the setter | |||
>>> bob._name # bypass the getter | |||
Charlie | |||
>> | |||
>>> | |||
>>> | |||
>>> | |||
>>> | |||
>>> | |||
=== रैकेट === | === रैकेट === | ||
[[रैकेट (प्रोग्रामिंग भाषा)]] में, ऑब्जेक्ट सिस्टम कोड को व्यवस्थित करने का एक तरीका है जो मॉड्यूल और यूनिट के अतिरिक्त आता है। बाकी भाषा की तरह, ऑब्जेक्ट सिस्टम में प्रथम श्रेणी के मान हैं और वस्तुओं और विधियों तक पहुंच को नियंत्रित करने के लिए लेक्सिकल स्कोप का उपयोग किया जाता है। | [[रैकेट (प्रोग्रामिंग भाषा)]] में, ऑब्जेक्ट सिस्टम कोड को व्यवस्थित करने का एक तरीका है जो मॉड्यूल और यूनिट के अतिरिक्त आता है। बाकी भाषा की तरह, ऑब्जेक्ट सिस्टम में प्रथम श्रेणी के मान हैं और वस्तुओं और विधियों तक पहुंच को नियंत्रित करने के लिए लेक्सिकल स्कोप का उपयोग किया जाता है। | ||
#lang racket | |||
(define student% | |||
# | (class object% | ||
( | (init-field name) | ||
(define/public (get-name) name) | |||
(define/public (set-name! new-name) (set! name new-name)) | |||
(super-new))) | |||
(define s (new student% [name "Alice"])) | |||
(send s get-name) ; => "Alice" | |||
( | (send s set-name! "Bob") | ||
( | (send s get-name) ; => "Bob" | ||
( | |||
( | |||
संरचनात्मक परिभाषाएँ नए प्रकार के मूल्यों को परिभाषित करने का एक वैकल्पिक तरीका है, जब स्पष्ट रूप से आवश्यक होने पर म्यूटेटर मौजूद होते हैं: | संरचनात्मक परिभाषाएँ नए प्रकार के मूल्यों को परिभाषित करने का एक वैकल्पिक तरीका है, जब स्पष्ट रूप से आवश्यक होने पर म्यूटेटर मौजूद होते हैं: | ||
#lang racket | |||
# | (struct student (name) #:mutable) | ||
( | (define s (student "Alice")) | ||
( | (set-student-name! s "Bob") | ||
( | (student-name s) ; => "Bob" | ||
( | |||
=== रुबी === | |||
< | रुबी में, अलग-अलग एक्सेसर और म्यूटेटर विधियों को परिभाषित किया जा सकता है, या मेटाप्रोग्रामिंग <code>attr_reader</code> या <code>attr_accessor</code>दोनों का उपयोग कक्षा में एक निजी चर घोषित करने के लिए किया जा सकता है और क्रमशः पढ़ने-योग्य या पढ़ने-लिखने के लिए सार्वजनिक पहुंच प्रदान करने के लिए किया जा सकता है। | ||
class Student | |||
def name | |||
@name | |||
end | |||
def name=(value) | |||
@name=value | |||
end | |||
end | |||
निहित <code>@name</code> चर के लिए केवल-पढ़ने के लिए सरल सार्वजनिक पहुंच | |||
class Student | |||
attr_reader :name | |||
end | |||
निहित <code>@name</code>चर के लिए सरल सार्वजनिक पहुंच पढ़ें-लिखें | |||
class Student | |||
attr_accessor :name | |||
end | |||
=== | === रस्ट === | ||
struct Student { | |||
name: String, | |||
} | |||
} | |||
impl Student { | |||
fn name(&self) -> &String { | |||
&self.name | |||
} | |||
fn set_name(&mut self, name: String) { | |||
self.name = name | |||
} | |||
} | |||
} | |||
=== स्मालटॉक === | === स्मालटॉक === | ||
age: aNumber | |||
" Set the receiver age to be aNumber if is greater than 0 and less than 150 " | |||
(aNumber between: 0 and: 150) | |||
ifTrue: [ age := aNumber ] | |||
=== तेज === | === तेज === | ||
class Student { | |||
private var _name: String = "" | |||
var name: String { | |||
get { | |||
return self._name | |||
} | |||
set { | |||
self._name = newValue | |||
} | |||
} | |||
} | |||
} | |||
=== विजुअल बेसिक .NET === | === विजुअल बेसिक .NET === | ||
यह उदाहरण कक्षाओं में उपयोग किए जाने वाले गुणों के VB.NET विचार को दिखाता है। | यह उदाहरण कक्षाओं में उपयोग किए जाने वाले गुणों के VB.NET विचार को दिखाता है। सी # के समान, <code>Get</code> और <code>Set</code> विधियों का स्पष्ट उपयोग होता है। | ||
Public Class Student | |||
Private _name As String | |||
Public Property Name() | |||
Get | |||
Return _name | |||
End Get | |||
Set(ByVal value) | |||
_name = value | |||
End Set | |||
End Property | |||
End Class | |||
VB.NET 2010 में, Get और Set सिंटैक्स का उपयोग किए बिना एक संपत्ति बनाने के लिए ऑटो इम्प्लीमेंटेड गुणों का उपयोग किया जा सकता है। ध्यान दें कि एक छुपा चर संकलक द्वारा बनाया गया है, जिसे कहा जाता है <code>_name</code>, संपत्ति के साथ मेल खाने के लिए <code>name</code>. नामित वर्ग के भीतर एक अन्य चर का उपयोग करना <code>_name</code> एक त्रुटि में परिणाम होगा। अंतर्निहित चर के लिए विशेषाधिकार प्राप्त पहुँच कक्षा के भीतर से उपलब्ध है। | VB.NET 2010 में, Get और Set सिंटैक्स का उपयोग किए बिना एक संपत्ति बनाने के लिए ऑटो इम्प्लीमेंटेड गुणों का उपयोग किया जा सकता है। ध्यान दें कि एक छुपा चर संकलक द्वारा बनाया गया है, जिसे कहा जाता है <code>_name</code>, संपत्ति के साथ मेल खाने के लिए <code>name</code>. नामित वर्ग के भीतर एक अन्य चर का उपयोग करना <code>_name</code> एक त्रुटि में परिणाम होगा। अंतर्निहित चर के लिए विशेषाधिकार प्राप्त पहुँच कक्षा के भीतर से उपलब्ध है। | ||
Public Class Student | |||
Public Property name As String | |||
End Class | |||
== यह भी देखें == | == यह भी देखें == | ||
* | * प्रोपर्टी (प्रोग्रामिंग भाषा) | ||
*[[अनुक्रमणिका (प्रोग्रामिंग)]] | *[[अनुक्रमणिका (प्रोग्रामिंग)|इंडेक्सर (प्रोग्रामिंग भाषा)]] | ||
* [[अपरिवर्तनीय वस्तु]] | * [[अपरिवर्तनीय वस्तु]] | ||
Revision as of 17:35, 18 February 2023
कंप्यूटर विज्ञान में, एक म्यूटेटर विधि एक चर में परिवर्तन को नियंत्रित करने के लिए उपयोग की जाने वाली विधि है। उन्हें व्यापक रूप से सेटर विधियों के रूप में भी जाना जाता है। अक्सर एक सेटर के साथ एक गेट्टर (एक साथ एक्सेसर्स के रूप में भी जाना जाता है) होता है, जो निजी सदस्य चर का मान लौटाता है।
एनकैप्सुलेशन के सिद्धांत को ध्यान में रखते हुए, म्यूटेटर विधि का उपयोग अक्सर ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में किया जाता है। इस सिद्धांत के अनुसार, एक वर्ग के सदस्य चर (प्रोग्रामिंग) को छिपाने और उन्हें अन्य कोड से बचाने के लिए निजी बनाया जाता है, और इसे केवल एक सार्वजनिक सदस्य फ़ंक्शन (म्यूटेटर विधि) द्वारा संशोधित किया जा सकता है, जो पैरामीटर के रूप में वांछित नया मान लेता है, वैकल्पिक रूप से मान्य करता है यह, और निजी सदस्य चर को संशोधित करता है। म्यूटेटर विधियों की तुलना असाइनमेंट ऑपरेटर ओवरलोडिंग से की जा सकती है लेकिन वे आम तौर पर ऑब्जेक्ट पदानुक्रम के विभिन्न स्तरों पर दिखाई देते हैं।
गैर-ऑब्जेक्ट-उन्मुख वातावरण में म्यूटेटर विधियों का भी उपयोग किया जा सकता है। इस स्थिति में, संशोधित किए जाने वाले वेरिएबल का एक सूचक (कंप्यूटर प्रोग्रामिंग) नए मान के साथ, म्यूटेटर को दिया जाता है। इस परिदृश्य में, संकलक कोड को म्यूटेटर विधि को बायपास करने और चर को सीधे बदलने से प्रतिबंधित नहीं कर सकता है। यह सुनिश्चित करने की जिम्मेदारी सॉफ्टवेयर डेवलपर की है कि वेरिएबल केवल म्यूटेटर विधि के माध्यम से संशोधित किया गया है और सीधे संशोधित नहीं किया गया है।
प्रोग्रामिंग भाषाओं में जो उनका समर्थन करते हैं, गुण (प्रोग्रामिंग) इनकैप्सुलेशन की उपयोगिता को छोड़े बिना एक सुविधाजनक विकल्प प्रदान करते हैं। नीचे दिए गए उदाहरणों में, एक पूरी तरह से कार्यान्वित म्यूटेटर विधि भी इनपुट डेटा को मान्य कर सकती है या किसी घटना को ट्रिगर करने जैसी आगे की कार्रवाई कर सकती है।
निहितार्थ
म्यूटेटर और एक्सेसर विधियों, या संपत्ति ब्लॉकों को परिभाषित करने का विकल्प, उदाहरण चर को निजी के अलावा कुछ दृश्यता देना है और इसे सीधे वस्तुओं के बाहर से एक्सेस करना है। म्यूटेटर और एक्सेसर्स का उपयोग करके एक्सेस अधिकारों के अधिक बेहतर नियंत्रण को परिभाषित किया जा सकता है। उदाहरण के लिए, एक पैरामीटर को केवल एक एक्सेसर को परिभाषित करके केवल पढ़ने के लिए बनाया जा सकता है, लेकिन एक म्यूटेटर नहीं। दो विधियों की दृश्यता भिन्न हो सकती है; एक्सेसर के सार्वजनिक होने के लिए यह अक्सर उपयोगी होता है जबकि म्यूटेटर संरक्षित, पैकेज-निजी या आंतरिक रहता है।
वह ब्लॉक (प्रोग्रामिंग) जहां म्यूटेटर परिभाषित किया गया है, आने वाले डेटा के सत्यापन या प्रीप्रोसेसिंग का अवसर प्रदान करता है। यदि सभी बाहरी पहुंच को म्यूटेटर के माध्यम से आने की गारंटी दी जाती है, तो इन चरणों को बायपास नहीं किया जा सकता है। उदाहरण के लिए, यदि किसी दिनांक को अलग-अलग निजी year
, month
और day
के चर द्वारा दर्शाया जाता है, तो आने वाली तिथियों को setDate
म्यूटेटर द्वारा विभाजित किया जा सकता है, जबकि निरंतरता के लिए समान निजी उदाहरण चर को setYear
और setMonth
द्वारा एक्सेस किया जाता है। सभी मामलों में 1 - 12 के बाहर के महीने के मूल्यों को उसी कोड द्वारा अस्वीकार किया जा सकता है।
एक्सेसर्स इसके विपरीत आंतरिक चर से उपयोगी डेटा अभ्यावेदन के संश्लेषण की अनुमति देते हैं जबकि उनकी संरचना को बाहरी मॉड्यूल से अलग और छिपा हुआ रखते हैं। एक मौद्रिक getAmount
एक्सेसर एक छिपे हुए currency
पैरामीटर द्वारा परिभाषित दशमलव स्थानों की संख्या के साथ एक संख्यात्मक चर से एक स्ट्रिंग बना सकता है।
आधुनिक प्रोग्रामिंग भाषाएं अक्सर एक ही पंक्ति में म्यूटेटर और एक्सेसर्स के लिए बॉयलरप्लेट कोड उत्पन्न करने की क्षमता प्रदान करती हैं - उदाहरण के लिए C#'spublic string Name { get; set; }
और रूबी का attr_accessor :name
इन मामलों में, सत्यापन, प्रीप्रोसेसिंग या संश्लेषण के लिए कोई कोड ब्लॉक नहीं बनाया जाता है। ये सरलीकृत एक्सेसर्स अभी भी सरल सार्वजनिक उदाहरण चर पर एनकैप्सुलेशन के लाभ को बरकरार रखते हैं, लेकिन यह सामान्य है कि जैसे-जैसे सिस्टम डिजाइन प्रगति करता है, सॉफ्टवेयर बनाए रखा जाता है और आवश्यकताएं बदलती हैं, डेटा की मांग अधिक परिष्कृत हो जाती है। कई स्वचालित म्यूटेटर और एक्सेसर्स अंततः कोड के अलग-अलग ब्लॉकों द्वारा प्रतिस्थापित किए जाते हैं। कार्यान्वयन के शुरुआती दिनों में उन्हें स्वचालित रूप से बनाने का लाभ यह है कि वर्ग का सार्वजनिक इंटरफ़ेस समान रहता है चाहे अधिक परिष्कार जोड़ा जाए या नहीं, यदि कोई व्यापक रिफैक्टरिंग की आवश्यकता नहीं है।[1]
कक्षा के अंदर से म्यूटेटर और एक्सेसर्स वाले पैरामीटर का हेरफेर जहां उन्हें परिभाषित किया जाता है, उन्हें अक्सर कुछ अतिरिक्त विचार की आवश्यकता होती है। कार्यान्वयन के शुरुआती दिनों में, जब इन ब्लॉकों में बहुत कम या कोई अतिरिक्त कोड नहीं होता है, तो इससे कोई फर्क नहीं पड़ता कि निजी इंस्टेंस चर को सीधे एक्सेस किया गया है या नहीं। सत्यापन, क्रॉस-वैलिडेशन, डेटा इंटीग्रिटी चेक, प्रीप्रोसेसिंग या अन्य परिष्कार के रूप में जोड़ा जाता है, सूक्ष्म बग दिखाई दे सकते हैं जहां कुछ आंतरिक पहुंच नए कोड का उपयोग करती है जबकि अन्य स्थानों पर इसे बायपास किया जाता है।
इसमें शामिल अतिरिक्त चरणों के कारण डेटा फ़ील्ड को सीधे लाने या संग्रहीत करने की तुलना में एक्सेसर फ़ंक्शन कम कुशल हो सकते हैं,[2] हालाँकि ऐसे कार्य अक्सर इनलाइन फ़ंक्शन होते हैं जो फ़ंक्शन कॉल के ओवरहेड को समाप्त कर देते हैं।
उदाहरण
सभा
student struct age dd ? student end .code student_get_age proc object:DWORD mov ebx, object mov eax, student.age[ebx] ret student_get_age endp student_set_age proc object:DWORD, age:DWORD mov ebx, object mov eax, age mov student.age[ebx], eax ret student_set_age endp
सी
#ifndef _STUDENT_H #define _STUDENT_H struct student; /* opaque structure */ typedef struct student student; student *student_new(int age, char *name); void student_delete(student *s); void student_set_age(student *s, int age); int student_get_age(student *s); char *student_get_name(student *s); #endif
#include <stdlib.h> #include <string.h> #include "student.h" struct student { int age; char *name; }; student *student_new(int age, char *name) { student *s = malloc(sizeof(student)); s->name = strdup(name); s->age = age; return s; } void student_delete(student *s) { free(s->name); free(s); } void student_set_age(student *s, int age) { s->age = age; } int student_get_age(student *s) { return s->age; } char *student_get_name(student *s) { return s->name; } #include <stdio.h> #include "student.h" int main(void) { student *s = student_new(19, "Maurice"); char *name = student_get_name(s); int old_age = student_get_age(s); printf("%s's old age = %i\n", name, old_age); student_set_age(s, 21); int new_age = student_get_age(s); printf("%s's new age = %i\n", name, new_age); student_delete(s); return 0; }
all: out.txt; cat $< out.txt: main; ./$< > $@ main: main.o student.o main.o student.o: student.h clean: ;$(RM) *.o out.txt main
सी ++
#ifndef STUDENT_H #define STUDENT_H #include <string> class Student { public: Student(const std::string& name); const std::string& name() const; void name(const std::string& name); private: std::string name_; }; #endif
In file Student.cpp:
#include "Student.h" Student::Student(const std::string& name) : name_(name) { } const std::string& Student::name() const { return name_; } void Student::name(const std::string& name) { name_ = name; }
सी#
यह उदाहरण गुणों के सी # विचार को दिखाता है, जो एक विशेष प्रकार के वर्ग सदस्य हैं। जावा के विपरीत, कोई स्पष्ट तरीके परिभाषित नहीं हैं; एक सार्वजनिक 'संपत्ति' में क्रियाओं को संभालने के लिए तर्क होता है। बिल्ट-इन (अघोषित) वेरिएबल value
के उपयोग पर ध्यान दें।
public class Student { private string name; /// <summary> /// Gets or sets student's name /// </summary> public string Name { get { return name; } set { name = value; } } }
बाद के C# संस्करणों (.NET फ्रेमवर्क 3.5 और ऊपर) में, निजी चर घोषित किए बिना, इस उदाहरण को संक्षिप्त रूप में निम्नानुसार किया जा सकता है name
.
बाद के C# संस्करणों (.NET फ्रेमवर्क 3.5 और ऊपर) में, निजी चर name
घोषित किए बिना, इस उदाहरण को निम्नानुसार संक्षिप्त किया जा सकता है।
public class Student { public string Name { get; set; } }
संक्षिप्त सिंटैक्स का उपयोग करने का अर्थ है कि अंतर्निहित चर अब कक्षा के अंदर से उपलब्ध नहीं है। नतीजतन, संपत्ति का set
हिस्सा असाइनमेंट के लिए मौजूद होना चाहिए। एक्सेस को set
-विशिष्ट एक्सेस संशोधक के साथ प्रतिबंधित किया जा सकता है।
public class Student { public string Name { get; private set; } }
सामान्य लिस्प
कॉमन लिस्प ऑब्जेक्ट सिस्टम में, क्लास परिभाषाओं के भीतर स्लॉट स्पेसिफिकेशंस इनमें से किसी को भी निर्दिष्ट कर सकते हैं :reader
, :writer
और :accessor
पाठक विधियों, सेटर विधियों और एक्सेसर विधियों (एक पाठक विधि और संबंधित setf
तरीका)।[3] के उपयोग के साथ स्लॉट हमेशा उनके नाम के माध्यम से सीधे पहुंच योग्य होते हैं with-slots
और slot-value
, और स्लॉट एक्सेसर विकल्प उपयोग करने वाली विशेष विधियों को परिभाषित करते हैं slot-value
.[4]
सीएलओएस के पास गुणों की कोई धारणा नहीं है, हालांकि कॉमन लिस्प ऑब्जेक्ट सिस्टम#मेटाओब्जेक्ट प्रोटोकॉल एक्सटेंशन निर्दिष्ट करता है कि स्लॉट के रीडर और लेखक फ़ंक्शन नामों तक पहुंचने के लिए, जिसमें से उत्पन्न होते हैं :accessor
विकल्प।[5]
निम्न उदाहरण इन स्लॉट विकल्पों और डायरेक्ट स्लॉट एक्सेस का उपयोग करके छात्र वर्ग की परिभाषा दिखाता है:
(defclass student () ((name :initarg :name :initform "" :accessor student-name) ; student-name is setf'able (birthdate :initarg :birthdate :initform 0 :reader student-birthdate) (number :initarg :number :initform 0 :reader student-number :writer set-student-number))) ;; Example of a calculated property getter (this is simply a method) (defmethod student-age ((self student)) (- (get-universal-time) (student-birthdate self))) ;; Example of direct slot access within a calculated property setter (defmethod (setf student-age) (new-age (self student)) (with-slots (birthdate) self (setf birthdate (- (get-universal-time) new-age)) new-age)) ;; The slot accessing options generate methods, thus allowing further method definitions (defmethod set-student-number :before (new-number (self student)) ;; You could also check if a student with the new-number already exists. (check-type new-number (integer 1 *)))
डी
डी (प्रोग्रामिंग भाषा) और सेटर फ़ंक्शन सिंटैक्स का समर्थन करता है। भाषा गेट्टर और सेटर वर्ग/संरचना विधियों के संस्करण 2 में @property
विशेषता होनी चाहिए।[6][7]
class Student { private char[] name_; // Getter @property char[] name() { return this.name_; } // Setter @property char[] name(char[] name_in) { return this.name_ = name_in; } }
एक Student
उदाहरण इस तरह इस्तेमाल किया जा सकता है:
auto student = new Student; student.name = "David"; // same effect as student.name("David") auto student_name = student.name; // same effect as student.name()
डेल्फी
यह डेल्फी भाषा में एक साधारण वर्ग है जो एक निजी क्षेत्र तक पहुँचने के लिए सार्वजनिक संपत्ति की अवधारणा को दर्शाता है।
interface type TStudent = class strict private FName: string; procedure SetName(const Value: string); public /// <summary> /// Get or set the name of the student. /// </summary> property Name: string read FName write SetName; end; // ... implementation procedure TStudent.SetName(const Value: string); begin FName := Value; end; end.
जावा
एक छात्र का प्रतिनिधित्व करने वाले एक साधारण वर्ग के इस उदाहरण में केवल संग्रहीत नाम के साथ, कोई देख सकता है कि चर नाम निजी है, अर्थात केवल छात्र वर्ग से दिखाई देता है, और "सेटर" और "गेटर" सार्वजनिक हैं, अर्थात् getName()
" और "setName(name)
" विधियां।
public class Student { private String name; public String getName() { return name; } public void setName(String newName) { name = newName; } }
जावास्क्रिप्ट
इस उदाहरण में कंस्ट्रक्टर-फंक्शन स्टूडेंट का उपयोग केवल संग्रहीत नाम वाले छात्र का प्रतिनिधित्व करने वाली वस्तुओं को बनाने के लिए किया जाता है।
function Student(name) { var _name = name; this.getName = function() { return _name; }; this.setName = function(value) { _name = value; }; }
या (वेब ब्राउज़रों में एक्सेसर्स को परिभाषित करने के लिए बहिष्कृत तरीके का उपयोग करते हुए
function Student(name) { var _name = name; this.__defineGetter__('name', function() { return _name; }); this.__defineSetter__('name', function(value) { _name = value; }); }
या (वंशानुक्रम और ES6
एक्सेसर सिंटैक्स के लिए प्रोटोटाइप का उपयोग करके
function Student(name){ this._name = name; } Student.prototype = { get name() { return this._name; }, set name(value) { this._name = value; }
या (प्रोटोटाइप का उपयोग किए बिना):
var Student = { get name() { return this._name; }, set name(value) { this._name = value; } };
या (डिफाइनप्रॉपर्टी का उपयोग करके):
function Student(name){ this._name = name; } Object.defineProperty(Student.prototype, 'name', { get: function() { return this._name; }, set: function(value) { this._name = value; } });
एक्शनस्क्रिप्ट 3.0
package { public class Student { private var _name : String; public function get name() : String { return _name; } public function set name(value : String) : void { _name = value; } } }
उद्देश्य-सी
Ubuntu 12.04
पर GNUstep
पर काम करने वाले के रूप में मैनुअल रेफरेंस काउंटिंग के साथ पारंपरिक ऑब्जेक्टिव-सी 1.0 सिंटैक्स का उपयोग करना:
@interface Student : NSObject { NSString *_name; } - (NSString *)name; - (void)setName:(NSString *)name; @end @implementation Student - (NSString *)name { return _name; } - (void)setName:(NSString *)name { [_name release]; _name = [name retain]; } @end
Mac OS X 10.6, iOS 4 और Xcode 3.2 में उपयोग किए गए नए Objective-C 2.0 सिंटैक्स का उपयोग करते हुए, ऊपर बताए अनुसार समान कोड जनरेट करना:
@interface Student : NSObject @property (nonatomic, retain) NSString *name; @end @implementation Student @synthesize name = _name; @end
और OS X 10.8 और iOS 6 से शुरू करते हुए, Xcode 4.4
और ऊपर का उपयोग करते हुए, सिंटैक्स को और भी सरल बनाया जा सकता है:
@interface Student : NSObject @property (nonatomic, strong) NSString *name; @end @implementation Student //Nothing goes here and it's OK. @end
पर्ल
package Student; sub new { bless {}, shift; } sub set_name { my $self = shift; $self->{name} = $_[0]; } sub get_name { my $self = shift; return $self->{name}; } 1;
या, कक्षा :: एक्सेसर का उपयोग करना
package Student; use base qw(Class::Accessor); __PACKAGE__->follow_best_practice; Student->mk_accessors(qw(name)); 1;
या, मूस (पर्ल) ऑब्जेक्ट सिस्टम का उपयोग करना:
package Student; use Moose; # Moose uses the attribute name as the setter and getter, the reader and writer properties # allow us to override that and provide our own names, in this case get_name and set_name has 'name' => (is => 'rw', isa => 'Str', reader => 'get_name', writer => 'set_name'); 1;
पीएचपी
PHP जादू के तरीकों को परिभाषित करती है __get
और__set
वस्तुओं के गुणों के लिए।[8]
एक सरल वर्ग (कंप्यूटर विज्ञान) के इस उदाहरण में एक छात्र का प्रतिनिधित्व करने वाला केवल नाम संग्रहीत है, कोई देख सकता है कि चर (प्रोग्रामिंग) नाम निजी है, अर्थात केवल छात्र वर्ग से दिखाई देता है, और सेटर और गेट्टर सार्वजनिक है, अर्थात् getName()
और setName('name')
तरीके।
class Student { private string $name; /** * @return string The name. */ public function getName(): string { return $this->name; } /** * @param string $newName The name to set. */ public function setName(string $newName): void { $this->name = $newName; } }
पायथन
यह उदाहरण एक चर, एक गेट्टर और एक सेटर के साथ एक पायथन वर्ग का उपयोग करता है।
class Student: # Initializer def __init__(self, name: str) -> None: # An instance variable to hold the student's name self._name = name # Getter method @property def name(self): return self._name # Setter method @name.setter def name(self, new_name): self._name = new_name
>>> bob = Student("Bob") >>> bob.name Bob >>> bob.name = "Alice" >>> bob.name Alice >>> bob._name = "Charlie" # bypass the setter >>> bob._name # bypass the getter Charlie
रैकेट
रैकेट (प्रोग्रामिंग भाषा) में, ऑब्जेक्ट सिस्टम कोड को व्यवस्थित करने का एक तरीका है जो मॉड्यूल और यूनिट के अतिरिक्त आता है। बाकी भाषा की तरह, ऑब्जेक्ट सिस्टम में प्रथम श्रेणी के मान हैं और वस्तुओं और विधियों तक पहुंच को नियंत्रित करने के लिए लेक्सिकल स्कोप का उपयोग किया जाता है।
#lang racket (define student% (class object% (init-field name) (define/public (get-name) name) (define/public (set-name! new-name) (set! name new-name)) (super-new))) (define s (new student% [name "Alice"])) (send s get-name) ; => "Alice" (send s set-name! "Bob") (send s get-name) ; => "Bob"
संरचनात्मक परिभाषाएँ नए प्रकार के मूल्यों को परिभाषित करने का एक वैकल्पिक तरीका है, जब स्पष्ट रूप से आवश्यक होने पर म्यूटेटर मौजूद होते हैं:
#lang racket (struct student (name) #:mutable) (define s (student "Alice")) (set-student-name! s "Bob") (student-name s) ; => "Bob"
रुबी
रुबी में, अलग-अलग एक्सेसर और म्यूटेटर विधियों को परिभाषित किया जा सकता है, या मेटाप्रोग्रामिंग attr_reader
या attr_accessor
दोनों का उपयोग कक्षा में एक निजी चर घोषित करने के लिए किया जा सकता है और क्रमशः पढ़ने-योग्य या पढ़ने-लिखने के लिए सार्वजनिक पहुंच प्रदान करने के लिए किया जा सकता है।
class Student def name @name end def name=(value) @name=value end end
निहित @name
चर के लिए केवल-पढ़ने के लिए सरल सार्वजनिक पहुंच
class Student attr_reader :name end
निहित @name
चर के लिए सरल सार्वजनिक पहुंच पढ़ें-लिखें
class Student attr_accessor :name end
रस्ट
struct Student { name: String, } impl Student { fn name(&self) -> &String { &self.name } fn set_name(&mut self, name: String) { self.name = name } }
स्मालटॉक
age: aNumber " Set the receiver age to be aNumber if is greater than 0 and less than 150 " (aNumber between: 0 and: 150) ifTrue: [ age := aNumber ]
तेज
class Student { private var _name: String = "" var name: String { get { return self._name } set { self._name = newValue } } }
विजुअल बेसिक .NET
यह उदाहरण कक्षाओं में उपयोग किए जाने वाले गुणों के VB.NET विचार को दिखाता है। सी # के समान, Get
और Set
विधियों का स्पष्ट उपयोग होता है।
Public Class Student Private _name As String Public Property Name() Get Return _name End Get Set(ByVal value) _name = value End Set End Property End Class
VB.NET 2010 में, Get और Set सिंटैक्स का उपयोग किए बिना एक संपत्ति बनाने के लिए ऑटो इम्प्लीमेंटेड गुणों का उपयोग किया जा सकता है। ध्यान दें कि एक छुपा चर संकलक द्वारा बनाया गया है, जिसे कहा जाता है _name
, संपत्ति के साथ मेल खाने के लिए name
. नामित वर्ग के भीतर एक अन्य चर का उपयोग करना _name
एक त्रुटि में परिणाम होगा। अंतर्निहित चर के लिए विशेषाधिकार प्राप्त पहुँच कक्षा के भीतर से उपलब्ध है।
Public Class Student Public Property name As String End Class
यह भी देखें
- प्रोपर्टी (प्रोग्रामिंग भाषा)
- इंडेक्सर (प्रोग्रामिंग भाषा)
- अपरिवर्तनीय वस्तु
संदर्भ
- ↑ Stephen Fuqua (2009). "Automatic Properties in C# 3.0". Archived from the original on 2011-05-13. Retrieved 2009-10-19.
- ↑ Tim Lee (1998-07-13). "Run Time Efficiency of Accessor Functions".
- ↑ "CLHS: Macro DEFCLASS". Retrieved 2011-03-29.
- ↑ "CLHS: 7.5.2 Accessing Slots". Retrieved 2011-03-29.
- ↑ "MOP: Slot Definitions". Retrieved 2011-03-29.
- ↑ "Functions - D Programming Language". Retrieved 2013-01-13.
{{cite web}}
: CS1 maint: url-status (link) - ↑ "The D Style". Retrieved 2013-02-01.
- ↑ "PHP: Overloading - Manual". www.php.net. Retrieved 2021-07-06.