রুবিতে কীভাবে একটি বিমূর্ত শ্রেণি প্রয়োগ করা যায়?


121

আমি জানি রুবিতে বিমূর্ত শ্রেণির কোনও ধারণা নেই। তবে যদি একেবারে বাস্তবায়ন করা দরকার হয় তবে কীভাবে এটি বাস্তবায়ন করা যায়? আমি এরকম কিছু চেষ্টা করেছিলাম ...

class A
  def self.new
    raise 'Doh! You are trying to write Java in Ruby!'
  end
end

class B < A
  ...
  ...
end

কিন্তু আমি বি ইনস্ট্যান্ট করার চেষ্টা করার সময়, এটি অভ্যন্তরীণভাবে কল করবে A.newযা ব্যতিক্রম বাড়াতে চলেছে।

এছাড়াও, মডিউলগুলি তাত্ক্ষণিকভাবে চালু করা যায় না তবে সেগুলিও উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে না। নতুন পদ্ধতি বেসরকারী করাও কাজ করবে না। কোন পয়েন্টার?


1
মডিউলগুলি মিশ্রিত করা যেতে পারে তবে আমার কি অন্য কোনও কারণে শাস্ত্রীয় উত্তরাধিকার প্রয়োজন বলে মনে করি?
জাচ

6
এমন নয় যে আমার একটি বিমূর্ত শ্রেণি প্রয়োগ করা দরকার । আমি ভাবছিলাম যে এটি কীভাবে করা যায়, যদি কারওর এটির প্রয়োজন হয়। একটি প্রোগ্রামিং সমস্যা। এটাই.
চিরন্তন

127
raise "Doh! You are trying to write Java in Ruby"
অ্যান্ড্রু গ্রিম

উত্তর:


61

আমি রুবিতে অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করতে পছন্দ করি না (প্রায় সবসময়ই এর চেয়ে ভাল উপায় আছে)। আপনি যদি সত্যিই পরিস্থিতিটির সর্বোত্তম কৌশলটি মনে করেন তবে আপনি কোন পদ্ধতিগুলি বিমূর্ত তা সম্পর্কে আরও ঘোষিত হতে নিম্নলিখিত স্নিপেটটি ব্যবহার করতে পারেন:

module Abstract
  def abstract_methods(*args)
    args.each do |name|
      class_eval(<<-END, __FILE__, __LINE__)
        def #{name}(*args)
          raise NotImplementedError.new("You must implement #{name}.")
        end
      END
      # important that this END is capitalized, since it marks the end of <<-END
    end
  end
end

require 'rubygems'
require 'rspec'

describe "abstract methods" do
  before(:each) do
    @klass = Class.new do
      extend Abstract

      abstract_methods :foo, :bar
    end
  end

  it "raises NoMethodError" do
    proc {
      @klass.new.foo
    }.should raise_error(NoMethodError)
  end

  it "can be overridden" do
    subclass = Class.new(@klass) do
      def foo
        :overridden
      end
    end

    subclass.new.foo.should == :overridden
  end
end

মূলত, আপনি কেবল abstract_methodsবিমূর্ত পদ্ধতিগুলির তালিকার সাথে কল করেছেন এবং যখন এটি বিমূর্ত শ্রেণীর উদাহরণ দ্বারা কল করা NotImplementedErrorহবে তখন একটি ব্যতিক্রম উত্থাপিত হবে।


এটি আসলে একটি ইন্টারফেসের মতো তবে আমি ধারণাটি পাই। ধন্যবাদ।
চিরন্তন

6
এটি কোনও বৈধ ব্যবহারের ক্ষেত্রে শোনায় না NotImplementedErrorযার মূলত "প্ল্যাটফর্ম নির্ভর", আপনার নিজের উপর উপলভ্য নয় "means দস্তাবেজগুলি দেখুন
স্কালে

6
আপনি মেটা-প্রোগ্রামিংয়ের মাধ্যমে একটি লাইন পদ্ধতিটি প্রতিস্থাপন করছেন, এখন একটি মেশিন অন্তর্ভুক্ত করে একটি পদ্ধতি কল করতে হবে। আমি মনে করি না এটি মোটেই বেশি ঘোষিত।
পাস্কাল

1
আমি এই উত্তরটি সম্পাদনা করে কিছু বাগগুলি ঠিক করে কোডটি আপডেট করেছি এবং এটি আপডেট করেছি, সুতরাং এটি এখন চলছে। অন্তর্ভুক্ত করার পরিবর্তে প্রসারিত ব্যবহারের জন্য কোডটিও
Magne

1
@ মণীশশ্রীবাস্তব: এখানে এখানে বনাম শেষের ব্যবহারের গুরুত্ব সম্পর্কে মন্তব্য করার জন্য দয়া করে এখনই এই কোডটি দেখুন
ম্যাগনে

113

এখানে দেরী করার জন্য, আমি মনে করি যে বিমূর্ত ক্লাসটি কাউকে ইনস্ট্যান্ট করা থেকে বিরত করার কোনও কারণ নেই, বিশেষত কারণ তারা উড়ে যাওয়ার ক্ষেত্রে এটিতে পদ্ধতি যুক্ত করতে পারে

রুবির মতো হাঁস-টাইপিংয়ের ভাষাগুলি রান করার সময় তাদের উপস্থিতি / অনুপস্থিতি বা আচরণের পদ্ধতি ব্যবহার করে তাদের ডাকা হবে কি না তা নির্ধারণ করতে। সুতরাং আপনার প্রশ্নটি যেমন এটি একটি বিমূর্ত পদ্ধতিতে প্রযোজ্য, তা বোধগম্য হয়

def get_db_name
   raise 'this method should be overriden and return the db name'
end

এবং এটি গল্পের শেষ হওয়া উচিত। জাভাতে অ্যাবস্ট্রাক্ট ক্লাস ব্যবহারের একমাত্র কারণ হ'ল জোর দেওয়া যে নির্দিষ্ট পদ্ধতিগুলি "পূর্ণ-ইন" হয় এবং অন্যদের বিমূর্ত শ্রেণিতে তাদের আচরণ থাকে। হাঁস-টাইপিংয়ের ভাষায়, ফোকাসটি ক্লাস / প্রকারের উপর নয়, পদ্ধতিগুলিতে থাকে, সুতরাং আপনার উদ্বেগগুলি সেই স্তরে নিয়ে যাওয়া উচিত।

আপনার প্রশ্নে আপনি মূলত abstractজাভা থেকে কীওয়ার্ডটি পুনরায় তৈরি করার চেষ্টা করছেন যা রুবিতে জাভা করার জন্য কোড-গন্ধ।


3
@ ক্রিস্টোফার পেরি: কোনও কারণেই কেন?
সাসকিউ

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

2
@ সাসকিউ, এটি রচনা করার জন্য আপনার প্যারেন্ট ক্লাসের বাস্তবায়ন বিশদ জানতে হবে না, আপনাকে কেবল এটির 'এপিআই' জানতে হবে। তবে আপনি উত্তরাধিকারী হলে আপনি পিতামাতার বাস্তবায়নের উপর নির্ভরশীল। যদি প্রয়োগটি পরিবর্তন করে তবে আপনার কোডটি অপ্রত্যাশিত উপায়ে ভেঙে যেতে পারে। আরও বিশদ এখানে
ক্রিস্টোফার পেরি

16
দুঃখিত, তবে "উত্তরাধিকারের উপরে পছন্দসই রচনা" "সর্বদা ব্যবহারকারীর রচনা" বলে না। যদিও সাধারণ উত্তরাধিকারসূত্রে এড়ানো উচিত, তবে বেশ কয়েকটি ব্যবহারের ক্ষেত্রে যখন তারা আরও ভাল ফিট হয়। অন্ধভাবে বই অনুসরণ করবেন না।
নওকার

1
@ নওকার অত্যন্ত গুরুত্বপূর্ণ পয়েন্ট "প্রায়শই এই ক্ষেত্রে ব্যবহারিক পদ্ধতির বিষয়টি কি" তা ভেবে আমরা প্রায়শই আমরা পড়তে বা শুনতে পারা স্টাফগুলিতে অন্ধ হয়ে যাই। এটি খুব কমই পুরোপুরি কালো বা সাদা।
প্রতি লুন্ডবার্গ

44

এটা চেষ্টা কর:

class A
  def initialize
    raise 'Doh! You are trying to instantiate an abstract class!'
  end
end

class B < A
  def initialize
  end
end

38
আপনি যদি #initializeবি এর সুপার ইন ব্যবহার করতে সক্ষম হতে চান তবে আপনি এ # আরম্ভের মধ্যে যা কিছু বাড়িয়ে তুলতে পারেন if self.class == A
এম কে 12

17
class A
  private_class_method :new
end

class B < A
  public_class_method :new
end

7
অতিরিক্ত হিসাবে এক জন উপ-শ্রেণীর মধ্যে কনস্ট্রাক্টর পদ্ধতিটি স্বয়ংক্রিয়ভাবে দৃশ্যমান করতে পিতামাত্ত শ্রেণীর উত্তরাধিকারসূত্রে প্রাপ্ত হুক ব্যবহার করতে পারে: ডি এ এএনহেরিটেড (সাবক্লাস); subclass.instance_eval {পাবলিক_ক্লাস_মোথার: নতুন}; শেষ
t6d

1
খুব সুন্দর টি 6 ডি। একটি মন্তব্য হিসাবে, এটি নিশ্চিত করে নিন যে এটির নথিভুক্ত রয়েছে, কারণ এটি আশ্চর্যজনক আচরণ (কমপক্ষে অবাক হওয়া লঙ্ঘন)।
নীলভানা

16

রেল বিশ্বের যে কোনও ব্যক্তির জন্য, অ্যাবস্ট্রাক্ট শ্রেণি হিসাবে একটি অ্যাক্টিভেকর্ড মডেল প্রয়োগ করা মডেল ফাইলটিতে এই ঘোষণার সাথে সম্পন্ন করা হয়:

self.abstract_class = true

12

আমার 2 ¢: আমি একটি সাধারণ, লাইটওয়েট ডিএসএল মিক্সিন বেছে নিই:

module Abstract
  extend ActiveSupport::Concern

  included do

    # Interface for declaratively indicating that one or more methods are to be
    # treated as abstract methods, only to be implemented in child classes.
    #
    # Arguments:
    # - methods (Symbol or Array) list of method names to be treated as
    #   abstract base methods
    #
    def self.abstract_methods(*methods)
      methods.each do |method_name|

        define_method method_name do
          raise NotImplementedError, 'This is an abstract base method. Implement in your subclass.'
        end

      end
    end

  end

end

# Usage:
class AbstractBaseWidget
  include Abstract
  abstract_methods :widgetify
end

class SpecialWidget < AbstractBaseWidget
end

SpecialWidget.new.widgetify # <= raises NotImplementedError

এবং, অবশ্যই, বেস ক্লাসটি আরম্ভ করার জন্য আরও একটি ত্রুটি যুক্ত করা এই ক্ষেত্রে ক্ষুদ্র হবে।


1
সম্পাদনা: ভাল পরিমাপের জন্য, যেহেতু এই পদ্ধতিটি সংজ্ঞায়িত পদ্ধতি ব্যবহার করে, তাই কেউ ব্যাকট্র্যাস অক্ষত থাকবে তা নিশ্চিত করতে চাইতে পারে, যেমন: err = NotImplementedError.new(message); err.set_backtrace caller()ওয়াইএমএমভি
অ্যান্টনি নাভারে

আমি এই পদ্ধতিটি বেশ মার্জিত বলে মনে করি। এই প্রশ্নে আপনার অবদানের জন্য আপনাকে ধন্যবাদ।
wes.hysell

12

গত 6/2 বছরের প্রোগ্রামিং রুবিতে আমার একবারও অ্যাবস্ট্রাক্ট ক্লাসের দরকার পড়েনি।

আপনি যদি ভাবছেন আপনার একটি বিমূর্ত শ্রেণির প্রয়োজন, আপনি রুবিতে নয়, এমন একটি ভাষা যা তাদের সরবরাহ করে / প্রয়োজন তা খুব বেশি ভাবছেন requires

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

আপডেট 2019: আমার 16½ বছরের ব্যবহারে রুবিতে অ্যাবস্ট্রাক্ট ক্লাসের প্রয়োজন নেই। আমার প্রতিক্রিয়াতে মন্তব্য করা সমস্ত লোক যা বলছে তা হ'ল প্রকৃতপক্ষে রুবি শেখার এবং মডিউলগুলির মতো উপযুক্ত সরঞ্জামগুলি (যা আপনাকে সাধারণ প্রয়োগও দেয়) ব্যবহার করে সম্বোধন করা হয়। আমি পরিচালনা করেছি এমন দলগুলিতে এমন লোক রয়েছে যারা ক্লাস তৈরি করেছেন যার বেস প্রয়োগ রয়েছে যা ব্যর্থ হয়েছে (বিমূর্ত শ্রেণীর মতো), তবে এগুলি বেশিরভাগ কোডিংয়ের অপচয় কারণ কারণ NoMethodErrorউত্পাদনে হুবহু একই ফলাফল তৈরি করতে পারে AbstractClassError


24
আপনার জাভাতে / প্রয়োজন / একটি বিমূর্ত শ্রেণি নেই। এটি নথিভুক্ত করার একটি উপায় যা এটি একটি বেস শ্রেণি এবং এটি আপনার শ্রেণি প্রসারিত লোকদের জন্য ইনস্ট্যান্ট করা উচিত নয় should
fijiaaron

3
আইএমও, কয়েকটি ভাষায় আপনার অবজেক্ট ভিত্তিক প্রোগ্রামিংয়ের ধারণাগুলি সীমাবদ্ধ করা উচিত। প্রদত্ত পরিস্থিতিতে উপযুক্ত কি ভাষার উপর নির্ভর করা উচিত নয়, যদি না পারফরম্যান্স সম্পর্কিত কোনও কারণ (বা আরও কিছু বাধ্যকর) থাকে।
thekingoftruth

10
@ ফিজিয়াআরন: আপনি যদি এমনটি মনে করেন তবে আপনি অবশ্যই বুঝতে পারবেন না যে বিমূর্ত বেস ক্লাসগুলি কী। এগুলি "দলিল" করার পক্ষে তেমন কিছু নয় যে কোনও শ্রেণি ইনস্ট্যান্ট করা উচিত নয় (এটি বরং এটি বিমূর্ত হওয়ার পার্শ্ব-প্রতিক্রিয়া)। এটি উত্পন্ন ক্লাসগুলির একগুচ্ছের জন্য একটি সাধারণ ইন্টারফেসের বক্তব্য দেওয়ার বিষয়ে আরও বেশি, যা গ্যারান্টি দেয় যে এটি কার্যকর করা হবে (যদি তা না হয় তবে উদ্ভূত শ্রেণিটিও বিমূর্ত থাকবে)। এর লক্ষ্যটি ক্লাসগুলির জন্য লিসকভের সাবস্টিটিউশন নীতিকে সমর্থন করা যার জন্য ইনস্ট্যান্টেশন খুব বেশি অর্থ দেয় না।
সাসকিউ

1
(নিয়ন্ত্রিত) অবশ্যই কিছু সাধারণ পদ্ধতি এবং সেগুলির মধ্যে বৈশিষ্ট্যগুলি সহ কেবলমাত্র কয়েকটি ক্লাস করা যায় তবে সংকলক / দোভাষী তখন জানতে পারবেন না যে এই শ্রেণিগুলি কোনওভাবেই সম্পর্কিত। পদ্ধতি এবং বৈশিষ্ট্যগুলির নামগুলি এই শ্রেণীর প্রত্যেকটিতে একই হতে পারে, তবে এই একার অর্থ এখনও এই নয় যে তারা একই কার্যকারিতা উপস্থাপন করে (নামের চিঠিপত্রটি কেবল দুর্ঘটনাজনক হতে পারে)। এই সম্পর্ক সম্পর্কে সংকলককে বলার একমাত্র উপায় হ'ল বেস ক্লাসটি ব্যবহার করা, তবে এই বেস বর্গের উপস্থিতিগুলির উপস্থিতিটি সর্বদা বোধগম্য হয় না।
সাসকিউ


4

ব্যাক্তিগতভাবে আমি বিমূর্ত ক্লাসের পদ্ধতিগুলিতে নোট-ইমপ্লিমেন্টেড এরির উত্থাপন করি। তবে আপনি যে কারণটি উল্লেখ করেছেন সে কারণে আপনি এটি 'নতুন' পদ্ধতি থেকে বাদ দিতে চাইতে পারেন।


তবে কীভাবে তা তাত্ক্ষণিকভাবে থামানো যায়?
চিরন্তন

ব্যক্তিগতভাবে আমি কেবল রুবি দিয়ে শুরু করছি, তবে পাইথনে, ঘোষিত __init ___ () পদ্ধতি সহ সাবক্লাসগুলি তাদের সুপারক্লাসের __init __ () পদ্ধতিগুলিতে স্বয়ংক্রিয়ভাবে কল করে না। আমি আশা করি রুবিতেও একইরকম ধারণা আসবে তবে আমি যেমন বলেছিলাম যে আমি সবে শুরু করছি।
জ্যাক

রুবিতে পিতামাতার initializeপদ্ধতিগুলি সুস্পষ্টভাবে সুপারের সাথে কল না করা হলে স্বয়ংক্রিয়ভাবে কল হয় না।
এম কে 12

4

আপনি যদি আপনার এ.এন.উ পদ্ধতিতে অদম্য ক্লাসের সাথে যেতে চান তবে ত্রুটি ছুঁড়ে দেওয়ার আগে স্ব == A পরীক্ষা করুন।

তবে প্রকৃতপক্ষে, মডিউলটি এখানে আপনি যা চান তার চেয়ে বেশি মনে হয় - উদাহরণস্বরূপ, গণনাযোগ্য এমন জিনিস যা অন্য ভাষায় একটি বিমূর্ত শ্রেণি হতে পারে। আপনি প্রযুক্তিগতভাবে সেগুলি সাবক্লাস করতে পারবেন না, তবে কলিং include SomeModuleমোটামুটি একই লক্ষ্য অর্জন করে। এটি আপনার পক্ষে কাজ করবে না এমন কোনও কারণ আছে?


4

আপনি কোন উদ্দেশ্যটি একটি বিমূর্ত শ্রেণীর সাথে পরিবেশন করার চেষ্টা করছেন? রুবিতে এটি করার আরও ভাল উপায় আছে তবে আপনি কোনও বিবরণ দেননি।

আমার নির্দেশক এটি; উত্তোলন না মিশ্রণ ব্যবহার করুন ।


প্রকৃতপক্ষে. একটি মডিউল মিশ্রন একটি অ্যাবস্ট্রাক্ট ক্লাস ব্যবহারের সমতুল্য হবে: উইকি.c2.com/?AbstractClass PS: আসুন তাদের মডিউলগুলি বলুন এবং মিক্সিন নয়, যেহেতু মডিউলগুলি সেগুলি হয় এবং সেগুলিতে মিক্সিং করা হয় যা আপনি তাদের সাথে করেন।
ম্যাগনে

3

অন্য উত্তর:

module Abstract
  def self.append_features(klass)
    # access an object's copy of its class's methods & such
    metaclass = lambda { |obj| class << obj; self ; end }

    metaclass[klass].instance_eval do
      old_new = instance_method(:new)
      undef_method :new

      define_method(:inherited) do |subklass|
        metaclass[subklass].instance_eval do
          define_method(:new, old_new)
        end
      end
    end
  end
end

এটি অবিযুক্তিযুক্ত পদ্ধতির প্রতিবেদন করার জন্য # সাধারণ_বিধ্বনিপূর্ণ_বিশ্বাসের উপর নির্ভর করে, তবে বিমূর্ত ক্লাসগুলি প্রয়োগ করা থেকে বিরত রাখে (এমনকি যদি তাদের একটি প্রাথমিক পদ্ধতি রয়েছে)

class A
  include Abstract
end
class B < A
end

B.new #=> #<B:0x24ea0>
A.new # raises #<NoMethodError: undefined method `new' for A:Class>

অন্যান্য পোস্টারগুলি যেমন বলেছে, আপনি সম্ভবত একটি বিমূর্ত শ্রেণির চেয়ে মিক্সিন ব্যবহার করা উচিত।


3

আমি এটি এইভাবে করেছি, সুতরাং এটি অ-বিমূর্ত শ্রেণিতে একটি নতুন সন্ধানের জন্য শিশু শ্রেণিতে নতুন নতুন সংজ্ঞা দেয়। আমি এখনও রুবীতে অ্যাবস্ট্রাক্ট ক্লাস ব্যবহারের কোনও ব্যবহারিক দেখতে পাই না।

puts 'test inheritance'
module Abstract
  def new
    throw 'abstract!'
  end
  def inherited(child)
    @abstract = true
    puts 'inherited'
    non_abstract_parent = self.superclass;
    while non_abstract_parent.instance_eval {@abstract}
      non_abstract_parent = non_abstract_parent.superclass
    end
    puts "Non abstract superclass is #{non_abstract_parent}"
    (class << child;self;end).instance_eval do
      define_method :new, non_abstract_parent.method('new')
      # # Or this can be done in this style:
      # define_method :new do |*args,&block|
        # non_abstract_parent.method('new').unbind.bind(self).call(*args,&block)
      # end
    end
  end
end

class AbstractParent
  extend Abstract
  def initialize
    puts 'parent initializer'
  end
end

class Child < AbstractParent
  def initialize
    puts 'child initializer'
    super
  end
end

# AbstractParent.new
puts Child.new

class AbstractChild < AbstractParent
  extend Abstract
end

class Child2 < AbstractChild

end
puts Child2.new

3

এই ছোট্ট abstract_typeমণিটিও রয়েছে, বিমূর্তভাবে ক্লাস এবং মডিউলগুলি একটি নিরবচ্ছিন্নভাবে ঘোষণা করার অনুমতি দেয়।

উদাহরণ ( README.md ফাইল থেকে):

class Foo
  include AbstractType

  # Declare abstract instance method
  abstract_method :bar

  # Declare abstract singleton method
  abstract_singleton_method :baz
end

Foo.new  # raises NotImplementedError: Foo is an abstract type
Foo.baz  # raises NotImplementedError: Foo.baz is not implemented

# Subclassing to allow instantiation
class Baz < Foo; end

object = Baz.new
object.bar  # raises NotImplementedError: Baz#bar is not implemented

1

আপনার পদ্ধতির সাথে কোনও ভুল নেই। প্রাথমিকভাবে ত্রুটি বাড়ানো ভাল মনে হয়, যতক্ষণ না আপনার সমস্ত সাবক্লাস অবশ্যই ওভাররাইড অবশ্যই প্রারম্ভিক হয়। আপনি নিজের মতো নতুন সংজ্ঞা দিতে চান না। এখানে আমি কি করব।

class A
  class AbstractClassInstiationError < RuntimeError; end
  def initialize
    raise AbstractClassInstiationError, "Cannot instantiate this class directly, etc..."
  end
end

আর একটি পদ্ধতির সমস্ত কার্যকারিতা একটি মডিউলে রাখা হবে, যা আপনি উল্লেখ করেছেন কখনই প্ররোচিত হতে পারে না। তারপরে অন্য ক্লাসের উত্তরাধিকার সূত্রে আপনার ক্লাসে মডিউল অন্তর্ভুক্ত করুন। যাইহোক, এটি সুপারের মতো জিনিসগুলি ভেঙে ফেলবে।

সুতরাং এটি নির্ভর করে আপনি কীভাবে এটি কাঠামো করতে চান depends যদিও মডিউলগুলি "অন্যান্য শ্রেণিগুলি ব্যবহারের জন্য উপযুক্ত হয়েছে এমন কিছু জিনিস আমি কীভাবে লিখব" এর সমস্যা সমাধানের জন্য একটি ক্লিনার সমাধানের মতো বলে মনে হচ্ছে


আমি তাও করতে চাই না। বাচ্চারা তখন "সুপার" বলতে পারে না।
অস্টিন জিগলার


0

এটি রুবির মতো মনে না হলেও আপনি এটি করতে পারেন:

class A
  def initialize
    raise 'abstract class' if self.instance_of?(A)

    puts 'initialized'
  end
end

class B < A
end

ফলাফলগুলো:

>> A.new
  (rib):2:in `main'
  (rib):2:in `new'
  (rib):3:in `initialize'
RuntimeError: abstract class
>> B.new
initialized
=> #<B:0x00007f80620d8358>
>>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.