আপনি জাভাতে ভার্চুয়াল ফাংশন / পদ্ধতি লিখতে পারেন?


165

জাভাতে ভার্চুয়াল পদ্ধতিগুলি লেখার জন্য কি সি ++ তে যেমন লেখা সম্ভব ?

বা, এমন কোনও জাভা পন্থা রয়েছে যা আপনি কার্যকর করতে পারেন যা একই আচরণ তৈরি করে? আমি কি কিছু উদাহরণ দিতে পারি?

উত্তর:


305

উইকিপিডিয়া থেকে

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



আমি wonded যদি এটা সত্যিই সত্য, কারণ আমি যা পড়েন করেছি, জাভা, ডায়নামিক পদ্ধতি প্রেরণ শুধুমাত্র বস্তু পদ্ধতির উপর বলা হয় ঘটে জন্য - যেমন ব্যাখ্যা করেছেন এখানে সুতরাং উদাহরণস্বরূপ সি জন্য ভার্চুয়াল ফাংশন ব্যাখ্যা ++, এখানে জাভা জন্য বৈধ নয়।
ব্রোকলি

@ কোয়াজিআইরফান এটি জাভা এবং সি # এর মধ্যে পার্থক্য।
শ্রীকান্ত করুণাঘাট

101

আপনি জাভাতে ভার্চুয়াল ফাংশন লিখতে পারেন?

হ্যাঁ. আসলে জাভাতে সমস্ত উদাহরণ পদ্ধতি ডিফল্টরূপে ভার্চুয়াল। কেবলমাত্র কয়েকটি পদ্ধতি ভার্চুয়াল নয়:

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

এখানে কিছু উদাহরন:

"সাধারণ" ভার্চুয়াল ফাংশন

নীচের উদাহরণটি অন্য উত্তরে উল্লিখিত উইকিপিডিয়া পৃষ্ঠার একটি পুরানো সংস্করণ

import java.util.*;

public class Animal 
{
   public void eat() 
   { 
      System.out.println("I eat like a generic Animal."); 
   }

   public static void main(String[] args) 
   {
      List<Animal> animals = new LinkedList<Animal>();

      animals.add(new Animal());
      animals.add(new Fish());
      animals.add(new Goldfish());
      animals.add(new OtherAnimal());

      for (Animal currentAnimal : animals) 
      {
         currentAnimal.eat();
      }
   }
}

class Fish extends Animal 
{
   @Override
   public void eat() 
   { 
      System.out.println("I eat like a fish!"); 
   }
}

class Goldfish extends Fish 
{
   @Override
   public void eat() 
   { 
      System.out.println("I eat like a goldfish!"); 
   }
}

class OtherAnimal extends Animal {}

আউটপুট:

আমি জেনেরিক অ্যানিমেলের মতো খাই।
আমি মাছের মতো খাই!
আমি সোনার ফিশের মতো খাই!
আমি জেনেরিক অ্যানিমেলের মতো খাই।

ইন্টারফেস সহ ভার্চুয়াল ফাংশনগুলির সাথে উদাহরণ

জাভা ইন্টারফেস পদ্ধতি সমস্ত ভার্চুয়াল। তাদের অবশ্যই ভার্চুয়াল হতে হবে কারণ তারা পদ্ধতি বাস্তবায়ন সরবরাহ করতে প্রয়োগকারী ক্লাসের উপর নির্ভর করে। কার্যকর করার কোডটি কেবল রান টাইমে নির্বাচিত হবে।

উদাহরণ স্বরূপ:

interface Bicycle {         //the function applyBrakes() is virtual because
    void applyBrakes();     //functions in interfaces are designed to be 
}                           //overridden.

class ACMEBicycle implements Bicycle {
    public void applyBrakes(){               //Here we implement applyBrakes()
       System.out.println("Brakes applied"); //function
    }
}

বিমূর্ত ক্লাস সহ ভার্চুয়াল ফাংশনগুলির সাথে উদাহরণ।

ইন্টারফেসের অনুরূপ অ্যাবস্ট্রাক্ট ক্লাসগুলিতে অবশ্যই ভার্চুয়াল পদ্ধতি থাকতে হবে কারণ তারা বর্ধিত শ্রেণীর প্রয়োগের উপর নির্ভর করে। উদাহরণ স্বরূপ:

abstract class Dog {                   
    final void bark() {               //bark() is not virtual because it is 
        System.out.println("woof");   //final and if you tried to override it
    }                                 //you would get a compile time error.

    abstract void jump();             //jump() is a "pure" virtual function 
}                                     
class MyDog extends Dog{
    void jump(){
        System.out.println("boing");    //here jump() is being overridden
    }                                  
}
public class Runner {
    public static void main(String[] args) {
        Dog dog = new MyDog();       // Create a MyDog and assign to plain Dog variable
        dog.jump();                  // calling the virtual function.
                                     // MyDog.jump() will be executed 
                                     // although the variable is just a plain Dog.
    }
}

1
এটি সবচেয়ে সম্পূর্ণ উত্তর হতে পারে। এটি ভার্চুয়াল ফাংশন বাস্তবায়নের 2 টি উপায় সরবরাহ করে যেহেতু জাভাটির কীওয়ার্ড নেই। ধন্যবাদ.
ক্রিস্টোফার বেলস

উইকিপিডিয়া উদ্ধৃতি চেয়ে অনেক ভাল উত্তর। সি ++ থেকে আসা এবং আমার জাভা অধ্যয়নের সাথে অলস হওয়া, আমি যা খুঁজছিলাম তার বিমূর্ততা ছিল।
ডেভিড

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

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

1
এখানে কয়েক বছর দেরি হলেও চমত্কার উত্তর
টম ও

55

জাভাতে সমস্ত ফাংশন ডিফল্টরূপে ভার্চুয়াল।

"চূড়ান্ত" কীওয়ার্ড যুক্ত করে আপনাকে নন-ভার্চুয়াল ফাংশনগুলি লিখতে হবে।

এটি সি ++ / সি # ডিফল্টের বিপরীত। ক্লাস ফাংশনগুলি ডিফল্টরূপে অ-ভার্চুয়াল হয়; আপনি "ভার্চুয়াল" সংশোধক যুক্ত করে এগুলি তৈরি করেন।


4
ক্লাউসের উত্তরে বর্ণিত ব্যক্তিগত ফাংশনগুলিও অ-ভার্চুয়াল।
ডন ল্যারিনেক্স

9

সমস্ত বেসরকারী উদাহরণ পদ্ধতি জাভাতে ডিফল্টরূপে ভার্চুয়াল।

সি ++ এ, ব্যক্তিগত পদ্ধতিগুলি ভার্চুয়াল হতে পারে। এটি নন-ভার্চুয়াল-ইন্টারফেস (এনভিআই) আইডিয়ামের জন্য ব্যবহার করা যেতে পারে। জাভাতে, আপনাকে এনভিআই ওভারাইডেবল পদ্ধতিগুলি সুরক্ষিত করা দরকার।

জাভা ভাষার উল্লেখ থেকে, v3:

8.4.8.1 (তাত্ক্ষণিক পদ্ধতি দ্বারা) ওভাররাইডিং একটি ক্লাস সিতে ঘোষিত একটি উদাহরণ পদ্ধতি এম 1 অন্য শ্রেণির পদ্ধতি এম 2 কে ওভাররাইড করে, ক্লাস এ-তে ঘোষিত যদি নীচের সমস্ত সত্য হয়:

  1. সি হ'ল এ-এর একটি সাবক্লাস is
  2. এম 1 এর স্বাক্ষর হ'ল এম 2 এর স্বাক্ষরের একটি সাবজিগেইন (§8.4.2)।
  3. হয় * এম 2 টি সি হিসাবে একই প্যাকেজে সর্বজনীন, সুরক্ষিত বা ডিফল্ট অ্যাক্সেসের সাথে ঘোষিত হয়, বা * m1 কোনও পদ্ধতি এম 3, এম 3 থেকে পৃথক এম 3, এম 2 থেকে এম 2 পৃথক, যেমন এম 3 এমআরটিকে ওভাররাইড করে।

4

হ্যাঁ, আপনি জাভাতে ভার্চুয়াল "ফাংশন" লিখতে পারেন।


1

জাভাতে, সমস্ত পাবলিক (বেসরকারী) ভেরিয়েবল এবং ফাংশনগুলি ডিফল্টরূপে ভার্চুয়ালচূড়ান্ত কীওয়ার্ড ব্যবহার করে ভেরিয়েবল এবং ফাংশনগুলি ভার্চুয়াল নয় ।


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