2009-06-24 32 views
14

मैं स्क्रिप्ट से अनावश्यकताओं को हटाने के लिए पर्ल कक्षाएं लिख रहा हूं और चूंकि कक्षाओं को कक्षाओं को बनाने में कई तरीके हैं, मुझे कक्षाओं को सही तरीके से बनाने में परेशानी होती है। तो क्या किसी के पास कक्षा का सबसे अच्छा अभ्यास उदाहरण है?मैं पर्ल क्लास कैसे बना सकता हूं?

मेरे पास सबसे बड़ा सवाल यह है कि यदि मॉड्यूल में कोई वैश्विक चर नहीं होना चाहिए तो आप मॉड्यूल में उप() में चर का उपयोग कैसे करते हैं? जावा स्वयं की तरह-> foo = 10;

असल में मुझे जावा या सी # या यहां तक ​​कि सी ++ में लिखी गई कक्षा दें और इसे पर्ल में लिखें। निजी, संरक्षित और सार्वजनिक वर्ग चर को सही तरीके से कैसे करना है यह दिखाने के लिए अतिरिक्त अंक भी। अनुमान लगाने के लिए विरासत और इंटरफेस उपयोगी होंगे।

+1

पर्ल की ओओ सुविधाओं में सबसे कम कमी है ...: पीआई एक साधारण। पीएम मॉड्यूल को देखेगा और देखें कि उन्हें कैसे लागू किया गया है –

उत्तर

24

बनाने पर्ल वस्तुओं की एक विशिष्ट तरीका एक hashref 'आशीर्वाद' के लिए है। ऑब्जेक्ट इंस्टेंस उसके बाद हैश कुंजी के अपने सेट के खिलाफ डेटा स्टोर कर सकता है।

package SampleObject; 

use strict; 
use warnings; 

sub new { 
    my ($class, %args) = @_; 
    return bless { %args }, $class; 
} 

sub sample_method { 
    my ($self) = @_; 
    print $self->{sample_data}; 
} 

और उपयोग:

my $obj = SampleObject->new(sample_data => 'hello world', 
          more_data => 'blah blah blah'); 
$obj->sample_method(); 

वैकल्पिक रूप से, एक्सेसर/mutator तरीकों जोड़ा जा सकता है (कक्षा :: Accessor, कक्षा :: Accessor :: जंजीर, आदि को देखने के ऊपर इनमें से आसान स्थापना के लिए) - इससे डेटा को सत्यापित करना और encapsulation जोड़ना आसान हो जाता है (यह पर्ल में लागू नहीं है, आपको यह सुनिश्चित करना होगा कि आपका कोड उपयुक्त एक्सेसर/म्यूटेटर के आसपास न जाए और सीधे हैशफ में डेटा तक पहुंच सके)।

+0

दो उत्तरों से सबसे अधिक सुरुचिपूर्ण लगता है। – kthakore

16

Moose देखें, जो कि पर्ल 5 ऑब्जेक्ट सिस्टम का विस्तार है।

निम्नलिखित मूस सीखने में मदद मिलेगी:

+0

मुझे एहसास है कि यह एक लोकप्रिय जवाब है, हालांकि यह वास्तव में मुझे नहीं दिखाता कि कैसे अन्य ओओपी भाषाओं के समान अपने स्वयं के वर्ग बनाओ। – kthakore

+2

हालांकि, पोस्ट ने आपको इंगित किया था। –

+2

आप सही हैं, इसके बजाय उन्होंने आपको लिंक दिए जो आपको दिखाते हैं कि यह कैसे करें। एक लिंक बहुत बेहतर होने पर कहीं और बाइट कॉपी/पेस्टिंग बर्बाद क्यों करें। – mpeters

23

खैर, पर्ल आसान है, लेकिन मैं अन्य भाषाओं में जंगली हूं, इसलिए मैं उनके साथ थोड़ा अपडेट करूँगा।

#!/usr/bin/perl 

package Person; 

use strict; 
use warnings; 
use Carp; 

sub new { 
    my $class = shift; 
    my $self = { @_ }; 
    croak "bad arguments" unless defined $self->{firstname} and defined $self->{lastname}; 
    return bless $self, $class; #this is what makes a reference into an object 
} 

sub name { 
    my $self = shift; 
    return "$self->{firstname} $self->{lastname}"; 
} 

#and here is some code that uses it 
package main; 

my $person = Person->new(firstname => "Chas.", lastname => "Owens"); 
print $person->name, "\n"; 

यहाँ एक ही कक्षा नई मूस शैली वस्तुओं का उपयोग करके लिखा है:: यहाँ एक सादे पर्ल वर्ग है

#!/usr/bin/perl 

package Person; 

use Moose; #does use strict; use warnings; for you 

has firstname => (is => 'rw', isa => 'Str', required => 1); 
has lastname => (is => 'rw', isa => 'Str', required => 1); 

sub name { 
    my $self = shift; 
    return $self->firstname . " " . $self->lastname; 
} 

#and here is some code that uses it 
package main; 

my $person = Person->new(firstname => "Chas.", lastname => "Owens"); 
print $person->name, "\n"; 

और MooseX :: प्रचार भी अधिक कोड की आवश्यकता पर दूर करता है और चीजों को देखने के लिए अच्छा:

#!/usr/bin/perl 

use MooseX::Declare; 

class Person { 
    has firstname => (is => 'rw', isa => 'Str', required => 1); 
    has lastname => (is => 'rw', isa => 'Str', required => 1); 

    method name { 
      return $self->firstname . " " . $self->lastname; 
    } 
} 

#and here is some code that uses it 
package main; 

my $person = Person->new(firstname => "Chas.", lastname => "Owens"); 
print $person->name, "\n"; 

एक त्वरित नोट, ये दो वर्ग पहले दो मूस कक्षाएं हैं जिन्हें मैंने कभी लिखा है। और यहाँ है कुछ बहुत ही जंग लगी सी ++ कोड (अपने आप को उस पर कटौती नहीं है या आप एक टिटनेस शॉट की आवश्यकता होगी):

#include <stdio.h> 
#include <string.h> 

class Person { 
    char* firstname; 
    char* lastname; 

    public: 
    Person(char* first, char* last) { 
     firstname = first; 
     lastname = last; 
    } 

    char* name(void) { 
     int len = strlen(firstname) + strlen(lastname) + 1; 
     char* name = new char[len]; 
     name[0] = '\0'; 
     strcat(name, firstname); 
     strcat(name, " "); 
     strcat(name, lastname); 
     return name; 
    } 
}; 

int main(void) { 
    Person* p = new Person("Chas.", "Owens"); 
    char* name = p->name(); 
    printf("%s\n", name); 
    delete name; 
    delete p; 
    return 0; 
} 
+0

बिल्कुल वही जो मैं चाहता था। आप 10 इंटरनेट अंक सर जीतते हैं। – kthakore

4

मूस, जो लोग पहले से ही उल्लेख किया है इसके अलावा ...

आप कर रहे हैं बस कक्षाओं (इसलिए, ऑब्जेक्ट्स नहीं) के बारे में बात करते हुए, आप आम तौर पर फ़ाइल में स्केल किए गए अक्षीय चर के साथ कक्षा डेटा बनाते हैं और प्रति फ़ाइल एक वर्ग का उपयोग करते हैं। आप उनके साथ सौदा करने के लिए एक्सेसर विधियां बनाते हैं। इसके साथ आप कई तरीकों से निपट सकते हैं।

हालांकि, ऐसा लगता है कि आपको Intermediate Perl या डेमियन कॉन्वे के Object Oriented Perl जैसे कुछ से शुरू करने की आवश्यकता है।स्टैक ओवरफ्लो उत्तर में सभी को पुन: उत्पन्न करने के लिए समय निकालने के लिए किसी को भी समझाने के लिए बहुत कुछ है।

+0

ओह अच्छी किताबें। धन्यवाद। – kthakore

संबंधित मुद्दे