রুবিতে পিতামাতার ক্লাসের নামটি কীভাবে পাব


86

ধরে নেওয়া যাক আমার একটি ক্লাস আছে Aএবং Bযেখানে Bউত্তরাধিকারসূত্রে রয়েছে A। আমি কীভাবে প্যারেন্ট ক্লাসের নাম মুদ্রণ করবB

class A
end

class B < A
end

আমি চেষ্টা করেছি কিছু জিনিস

>> B.new.class #=> B   #which is correct
>> B.new.parent  #=> Undefined method `parent`
>> B.parent   #=> Object
>> B.parent.class #=> Class

ধন্যবাদ :)


4
যখন এইরকম আটকে যায় তখন সর্বদা চেষ্টা করুন B.methods.sortb আপনার পক্ষে যে পদ্ধতির নামটি সন্ধান করছেন তাতে কোনও কিছু আপনাকে একটি সূত্র দেবে।
Ivaylo স্ট্রান্ডজেভ

@ IvayloStrandjev এটি সাহায্য করবে না। দেখার জন্য অনেকগুলি পদ্ধতি রয়েছে। এটা সময় নষ্ট।
সাওয়া

4
@ সোয়া সত্য নয় আমাকে 30 সেকেন্ড নিল অন্যান্য ব্যবহারকারীদের আমার চেয়ে দ্রুত হওয়া যথেষ্ট, তবুও বেশ দ্রুত।
Ivaylo স্ট্রান্ডজেভ

9
@ চেকিট: অনেক সরল! 8.methods.grep(/class/)আপনার এই ধরণের ফিল্টারিংয়ের সাথে বাছাই করার দরকার নেই :)
সেরজিও টুলেন্টসেভ

পছন্দ করুন এটি সত্যিই সহায়ক হবে :)
রাহুল তপালি

উত্তর:



62

আপনি যদি পুরো পূর্বপুরুষের স্ট্যাকটি দেখতে চান:

object.class.ancestors

এই ক্ষেত্রে:

> a = Array.new
=> []
> a.class.ancestors
=> [Array, Enumerable, Object, Kernel, BasicObject]

4
মনে রাখবেন যে ক্লাসে অন্তর্ভুক্ত মডিউলগুলিও অন্তর্ভুক্ত। আপনি Arrayএরপরে দেখতে পাচ্ছেন Enumerableযা কোন পিতামাতার নয়, তবে অ্যারেতে অন্তর্ভুক্ত একটি মডিউল । আপনি যদি কেবল ক্লাস চান তবে আপনি এর মতো কিছু করতে পারেন Array.ancestors.select { |ancestor| ancestor.is_a? Class } #=> [Array, Object, BasicObject]
3limin4t0r

18

একটি অবজেক্ট (ইনস্ট্যান্টিয়েটেড ক্লাস) দেওয়া আপনি পিতামাতার ক্লাসটি অর্জন করতে পারেন

>> x = B.new
>> x.class.superclass.name
=>"A"

16

যদি গুগল এখানে যারা পাগল মধ্যে কাজ করছে, আপনি কি পরিবর্তে চান পারে এনেছে base_class, যেমন superclassActiveRecord উত্তরাধিকার গঠন পাশাপাশি তর্ক হবে।

class A < ActiveRecord::Base
end

class B < A
end

> A.superclass
=> ActiveRecord::Base
> B.superclass
=> A

> A.base_class
=> A
> B.base_class
=> A

এমনকি আরও...

class C < B
end

> C.base_class
=> A

অন্য কথায়, base_classআপনাকে উত্তরাধিকার গাছের শীর্ষ দেয় তবে আপনার আবেদনের প্রসঙ্গে সীমাবদ্ধ। যদিও যথাযথ সতর্কতা, যতদূর রেইল সম্পর্কিত, "আপনার অ্যাপ্লিকেশন" তে আপনি যে কোনও রত্ন ব্যবহার করছেন তা অন্তর্ভুক্ত রয়েছে, সুতরাং আপনার যদি এমন কোনও মডেল থাকে যা রত্নে সংজ্ঞায়িত কোনও কিছুকে সাবক্লাস করে, base_classতবে রত্নটির শ্রেণি ফিরে আসবে, আপনার নয়।


8

আপনি যে শব্দটির সন্ধান করছেন তা হ'ল superclass। এবং প্রকৃতপক্ষে আপনি B.superclassপেতে করতে পারেন A। (এর B.ancestorsথেকে প্রাপ্ত সমস্ত শ্রেণীর এবং মডিউলগুলির তালিকা পেতে আপনিও করতে পারেন - এর মতো কিছু do [B, A, Object, Kernel, BasicObject])


2

উত্তরাধিকার দুটি শ্রেণীর মধ্যে একটি সম্পর্ক। উত্তরাধিকার ক্লাসগুলির মধ্যে পিতামাতার সাথে সম্পর্ক তৈরি করে। কোড পুনরায় ব্যবহারের জন্য এবং পাবলিক ক্লাস এবং ইন্টারফেসের মাধ্যমে মূল সফ্টওয়্যারটির স্বাধীন এক্সটেনশনের অনুমতি দেওয়ার জন্য এটি একটি প্রক্রিয়া inherit উত্তরাধিকারের সুবিধা হ'ল শ্রেণিবদ্ধতা নীচে বর্গগুলি উচ্চতরগুলির বৈশিষ্ট্যগুলি পেতে পারে তবে তাদের নিজস্ব বৈশিষ্ট্যগুলিও যুক্ত করতে পারে ।

রুবিতে, কোনও শ্রেণি কেবলমাত্র অন্য একক শ্রেণীর উত্তরাধিকারী হতে পারে। (অর্থাত্ একটি শ্রেণি অন্য শ্রেণীর কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত একটি শ্রেণীর কাছ থেকে উত্তরাধিকারী হতে পারে, তবে একক শ্রেণী এক সাথে অনেকগুলি শ্রেণীর উত্তরাধিকারী হতে পারে না)। বেসিকঅবজেক্ট ক্লাসটি রুবির সকল ক্লাসের পিতামাতার ক্লাস। সুস্পষ্টভাবে ওভাররাইড না করা পর্যন্ত এর পদ্ধতিগুলি সমস্ত অবজেক্টের জন্য উপলব্ধ।

রুবি মেশিন ব্যবহার করে একবারে একক শ্রেণীর উত্তরাধিকার অতিক্রম করে।

আমি একটি উদাহরণ দিয়ে ব্যাখ্যা করার চেষ্টা করব।

module Mux
 def sam
  p "I am an module"
 end
end
class A
  include Mux
end
class B < A
end
class C < B
end
class D < A
end

আপনি শ্রেণী_নাম.সুপারক্লাস.নাম ব্যবহার করে ট্রেস করতে পারেন এবং যদি আপনি এই শ্রেণিবিন্যাসে বেসিক অবজেক্ট না পান তবে এই প্রক্রিয়াটি করতে পারেন। বেসিকজেক্টটি প্রতিটি ক্লাসে সুপার ক্লাস। ধরা যাক আমরা ক্লাস সি শ্রেণিবদ্ধ গাছ দেখতে চাই।

 C.superclass
   => B
 B.superclass
  => A
 A.superclass
  => Object
 Object.superclass
  => BasicObject

আপনি ক্লাস সি এর পুরো শ্রেণিবিন্যাস দেখতে পাচ্ছেন এই পন্থাটি ব্যবহার করে লক্ষ্য করুন আপনি পিতামাত্ত শ্রেণিতে অন্তর্ভুক্ত বা প্রেন্টড মডিউলগুলি পাবেন না।

মডিউল সহ সম্পূর্ণ শ্রেণিবিন্যাস সন্ধান করার জন্য আরও একটি পদ্ধতি রয়েছে। রুবি ডকের পূর্বপুরুষদের মতে । মোডে অন্তর্ভুক্ত / প্রেন্টড মডিউলগুলির একটি তালিকা ফেরত দেয় (নিজে নিজেই মোড)।

C.ancestors
 => [C, B, A, Mux, Object, Kernel, BasicObject]

এখানে, Mux এবং কার্নেল হল মডিউল।

http://rubylearning.com/satishtalim/ruby_inheritance.html https://en.wikedia.org/wiki/Inheritance_(object-oriented_programming)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.