ES6 এ সুপার ব্যবহার না করে কীভাবে ক্লাস বাড়ানো যায়?


104

superপিতামাতার ক্লাসটি শুরু করার পদ্ধতিটি কল না করেই কি ES6 এ কোনও শ্রেণি বাড়ানো সম্ভব ?

সম্পাদনা: প্রশ্নটি বিভ্রান্তিকর হতে পারে। এটি যে স্ট্যান্ডার্ডটি আমাদের কল করতে হবে super()বা আমি কিছু মিস করছি?

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

class Character {
   constructor(){
      console.log('invoke character');
   }
}

class Hero extends Character{
  constructor(){
      super(); // exception thrown here when not called
      console.log('invoke hero');
  }
}

var hero = new Hero();

যখন আমি super()উদ্ভূত শ্রেণিতে কল করছি না তখন আমি একটি স্কোপ সমস্যা -> পেয়ে যাচ্ছিthis is not defined

আমি v2.3.0 এ iojs --harmon সাথে এটি চালাচ্ছি


স্কোপ সমস্যা বলতে কী বোঝ? আপনি কি ব্যতিক্রম (এবং কোথায়) পাচ্ছেন?
অমিত

সুপার () না বলে ডাকলে আমি আমার উদ্ভূত ক্লাসে এক্সপেকশন পেয়ে যাচ্ছি। আমি আমার প্রশ্নটি আরও পরিষ্কার করার জন্য সম্পাদনা করেছি :)
xhallix

আপনি কোন পরিবেশে এটি চালাচ্ছেন?
অমিত

6
আপনার কোনও বিকল্প নেই যদি আপনি অন্য শ্রেণিটি বাড়ান তবে কনস্ট্রাক্টরকে অবশ্যই প্রথমে সুপার () কল করতে হবে।
জোনাথন ডি এম

@ জোনাথান্ডেএম আপনাকে ধন্যবাদ, সুতরাং ভবিষ্যতে আমার অনুমান করার উপায় এটিই এইভাবে?
এক্সহ্যালিক্স

উত্তর:


153

ES2015 (ES6) ক্লাসের নিয়মগুলি নীচে নেমে আসে:

  1. চাইল্ড ক্লাস কনস্ট্রাক্টারে, ডাকা thisনা হওয়া পর্যন্ত ব্যবহার করা যাবে না super
  2. ES6 শ্রেণীর নির্মাতারা কল করতে superহবে তারা যদি সাবক্লাস হয় তবে তাদের অবশ্যই স্পষ্টভাবে কিছু বস্তু ফিরে আসতে হবে যা আরম্ভ করা হয়নি of

এটি ES2015 অনুমানের দুটি গুরুত্বপূর্ণ বিভাগে নেমে আসে।

বিভাগ 8.1.1.3.4 ফাংশনে কী আছে তা নির্ধারণ করার জন্য যুক্তি সংজ্ঞায়িত করে this। শ্রেণীর জন্য গুরুত্বপূর্ণ অংশটি হ'ল এটি thisকোনও "uninitialized"রাজ্যে থাকা সম্ভব এবং এই অবস্থায় যখন ব্যবহার করার চেষ্টা করা হয় তখন thisব্যতিক্রম ছুঁড়ে ফেলা হয়।

বিভাগ 9.2.2 , [[Construct]]যা newবা এর মাধ্যমে ডাকা ফাংশনগুলির আচরণের সংজ্ঞা দেয় super। বেস ক্লাসের কনস্ট্রাক্টরকে কল thisকরার সময় # 8 ম ধাপে আরম্ভ করা হয় [[Construct]], তবে অন্যান্য সমস্ত ক্ষেত্রে thisএটি অবিচ্ছিন্ন করা হয়। নির্মাণ শেষে, GetThisBindingবলা হয়, সুতরাং যদি superএখনও না ডাকা হয় (এইভাবে আরম্ভ করা হয় this), বা স্পষ্ট প্রতিস্থাপন বস্তুটি ফিরে না পেয়েছে তবে কনস্ট্রাক্টর কলের চূড়ান্ত লাইনটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে।


4
আপনি কল না করে কোনও শ্রেণীর উত্তরাধিকার সূত্রে কোনও পথের পরামর্শ দিতে পারেন super()?
বার্গি

4
আপনি কি মনে করেন যে ES6 super()এ কনস্ট্রাক্টরকে কল না করে কোনও শ্রেণীর উত্তরাধিকার সূত্রে সম্ভব ?
বার্গি

9
সম্পাদনার জন্য ধন্যবাদ - এখনই এটি আছে; আপনি return Object.create(new.target.prototype, …)সুপার কনস্ট্রাক্টর কল এড়াতে করতে পারেন ।
বার্গি

4
@ ম্যাক্সিমাস দেখুন "new.target" কি?
বার্গি

4
কনস্ট্রাক্টর বাদ দিলে যা ঘটে তা আপনার যুক্ত করা উচিত: এমডিএন অনুসারে একটি ডিফল্ট কনস্ট্রাক্টর ব্যবহার করা হবে ।
ক্লেইনফ্রেয়ন্ড

12

একাধিক উত্তর এবং মন্তব্য রয়েছে যা উল্লেখ করে যে ভিতরে প্রথম লাইন হওয়া super আবশ্যকconstructor । এটা সহজ ভুল। @ লগনফস্মিথ উত্তরের প্রয়োজনীয়তার প্রয়োজনীয় উল্লেখ রয়েছে তবে এটি এটিকে সিদ্ধ করে দেয়:

Inheriting ( extends) কন্সট্রাকটর আবশ্যক কল superব্যবহার করার আগে thisএবং ফেরার আগে এমনকি যদি thisব্যবহার করা হয় না

thisকল করার আগে বিবৃতি (ব্যবহার না করে ) কেন বোধগম্য হতে পারে তা দেখতে নীচে খণ্ডগুলি (ক্রোমে কাজ করে ...) দেখুন super

'use strict';
var id = 1;
function idgen() {
  return 'ID:' + id++;
}

class Base {
  constructor(id) {
    this.id = id;
  }

  toString() { return JSON.stringify(this); }
}

class Derived1 extends Base {
  constructor() {
    var anID = idgen() + ':Derived1';
    super(anID);
    this.derivedProp = this.baseProp * 2;
  }
}

alert(new Derived1());


4
"See fragment below (works in Chrome...)"ক্রোম বিকাশকারী কনসোলের খুলুন এবং উপর "চালান কোড স্নিপেট" ক্লিক করুন: Uncaught ReferenceError: this is not defined। অবশ্যই, আপনি কনস্ট্রাক্টরে আগে পদ্ধতি ব্যবহার করতে পারেন super()তবে আপনি ক্লাসের আগে পদ্ধতি ব্যবহার করতে পারবেন না!
মার্সেল

যা আপনি এর thisআগে ব্যবহার করতে পারবেন না super()(আপনার কোড এটি প্রমাণ করে) এর সাথে সাথে স্পেসিফিকেশনটির কোনও সম্পর্ক নেই, তবে জাভাস্ক্রিপ্টের প্রয়োগের সাথে। সুতরাং, আপনাকে 'এটি' এর আগে 'সুপার' বলতে হবে।
মার্সেল

@মার্সেল - আমি মনে করি আমাদের অনেক বিভ্রান্তি ছিল। আমি কেবল (সমস্ত বরাবর) উল্লেখ করছিলাম যে ব্যবহারের আগে STATEMENTS রাখা আইনী superএবং আপনি বলেছিলেন যে thisফোন করার আগে এটি ব্যবহার করা অবৈধ super। আমরা দুজনেই ঠিক আছি, একে অপরকে বুঝতে পারি নি :-) (এবং এই ব্যতিক্রমটি উদ্দেশ্যমূলক ছিল, যা বৈধ নয় তা দেখানোর জন্য - আমি সম্পত্তিটির নাম 'উইলফেইল' দিয়েছিলাম)
অমিত

9

নতুন এস class শ্রেণির সিনট্যাক্সটি প্রোটোটাইপ সহ "পুরাতন" এস 5 "ক্লাস" এর জন্য অন্য একটি স্বরলিপি। অতএব আপনি কোনও নির্দিষ্ট শ্রেণীর প্রোটোটাইপ (বেস ক্লাস) সেট না করে ইনস্ট্যান্ট করতে পারবেন না।

এটি আপনার স্যান্ডউইচটিতে পনির তৈরি না করে রাখার মতো। এছাড়াও আপনি স্যান্ডউইচ তৈরির আগে পনির রাখতে পারবেন না , তাই ...

... thisসুপার ক্লাস সহ কল ​​করার আগে কীওয়ার্ড ব্যবহার করার super()অনুমতি দেওয়া হয় না।

// valid: Add cheese after making the sandwich
class CheeseSandwich extend Sandwich {
    constructor() {
        super();
        this.supplement = "Cheese";
    }
}

// invalid: Add cheese before making sandwich
class CheeseSandwich extend Sandwich {
    constructor() {
        this.supplement = "Cheese";
        super();
    }
}

// invalid: Add cheese without making sandwich
class CheeseSandwich extend Sandwich {
    constructor() {
        this.supplement = "Cheese";
    }
}

আপনি যদি বেস ক্লাসের জন্য কনস্ট্রাক্টর নির্দিষ্ট না করেন তবে নিম্নলিখিত সংজ্ঞাটি ব্যবহৃত হয়:

constructor() {}

উত্পন্ন ক্লাসগুলির জন্য, নিম্নলিখিত ডিফল্ট নির্মাণকারী ব্যবহার করা হয়:

constructor(...args) {
    super(...args);
}

সম্পাদনা: এটি পাওয়া গেছে developer.mozilla.org:

When used in a constructor, the super keyword appears alone and must be used before the this keyword can be used.

সূত্র


সুতরাং আমি যদি আপনাকে সঠিকভাবে বুঝতে পারি তবে আমি আমার ক্লাস হিরোর ক্লাস ক্যারেক্টার থেকে কোনও পদ্ধতি ব্যবহার করতে সক্ষম হব না, যখন সুপার () ব্যবহার না করে? তবে এটি পুরোপুরি সঠিক বলে মনে হচ্ছে না, কারণ আমি বেস বর্গ থেকে পদ্ধতিগুলি কল করতে পারি। সুতরাং আমি অনুমান করি যে কনস্ট্রাক্টরকে ফোন করার সময় আমার কেবল সুপার দরকার
xhallix

1. ওপিতে, thisমোটেই ব্যবহৃত হয় না। ২. জেএস কোনও স্যান্ডউইচ নয়, এবং ES5 এ আপনি সর্বদা ব্যবহার করতে পারেন this, এমনকি আপনার পছন্দ মতো অন্য কোনও ফাংশন কল করার আগে (এটি পরিপূরক সম্পত্তির সংজ্ঞা দিতে পারে বা নাও পারে)
অমিত

@ এমিট ১. এবং এখন আমি thisখুব বেশি ব্যবহার করতে পারি না ?! 2. আমার জেএস শ্রেণি একটি স্যান্ডউইচ প্রতিনিধিত্ব করে, এবং ES6 এ আপনি সর্বদা ব্যবহার করতে পারবেন না this। আমি কেবল এস classes ক্লাস (একটি রূপক সহ) ব্যাখ্যা করার চেষ্টা করছি এবং কারওর পক্ষে এ জাতীয় ধ্বংসাত্মক / অপ্রয়োজনীয় মন্তব্য দরকার নেই।
মার্সেল

@মার্সেল ক্ষিপ্ততার জন্য আমার ক্ষমা চেয়েছিলেন, কিন্তু: ১. ওপিতে বিদ্যমান নয় এমন একটি নতুন সমস্যা চালু করার বিষয়ে about 2 হ'ল আপনার দৃষ্টি আকর্ষণ করা উচিত যে আপনার দাবিটি ভুল (এখনও এখনও এটি রয়ে গেছে)
অমিত

@মার্সেল - আমার উত্তর দেখুন
অমিত

4

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

যেমন আপনি প্রতি সাবক্লাসে কোনও কনস্ট্রাক্টর তৈরি করেন না তবে কেবলমাত্র সেই পদ্ধতির উল্লেখ যা সম্পর্কিত সাবক্লাসে ওভাররাইড করা হয়।

তার অর্থ আপনি নিজের উপর চাপানো কন্সট্রাক্টর কার্যকারিতা থেকে নিজেকে মুক্ত রাখুন এবং একটি নিয়মিত পদ্ধতিতে বিরত থাকুন - যা ওভাররাইড হয়ে যেতে পারে এবং সুপার () প্রয়োগ করতে পারে না আপনি নিজের পছন্দটি যদি দেয় তবে কোথায় এবং কীভাবে আপনি সুপার কল করতে চান (পুরোপুরি alচ্ছিক) যেমন:

super.ObjectConstructor(...)

class Observable {
  constructor() {
    return this.ObjectConstructor(arguments);
  }

  ObjectConstructor(defaultValue, options) {
    this.obj = { type: "Observable" };
    console.log("Observable ObjectConstructor called with arguments: ", arguments);
    console.log("obj is:", this.obj);
    return this.obj;
  }
}

class ArrayObservable extends Observable {
  ObjectConstructor(defaultValue, options, someMoreOptions) {
    this.obj = { type: "ArrayObservable" };
    console.log("ArrayObservable ObjectConstructor called with arguments: ", arguments);
    console.log("obj is:", this.obj);
    return this.obj;
  }
}

class DomainObservable extends ArrayObservable {
  ObjectConstructor(defaultValue, domainName, options, dependent1, dependent2) {
    this.obj = super.ObjectConstructor(defaultValue, options);
    console.log("DomainObservable ObjectConstructor called with arguments: ", arguments);
    console.log("obj is:", this.obj);
    return this.obj;
  }
}

var myBasicObservable = new Observable("Basic Value", "Basic Options");
var myArrayObservable = new ArrayObservable("Array Value", "Array Options", "Some More Array Options");
var myDomainObservable = new DomainObservable("Domain Value", "Domain Name", "Domain Options", "Dependency A", "Depenency B");

চিয়ার্স!


4
আমার এই
একটিটির জন্য

@ সুইডিক্স: যাদুটি কনস্ট্রাক্টরের অভ্যন্তরে রয়েছে, যেখানে 'এটি' আপনি কোন ধরণের অবজেক্ট তৈরি করছেন তার উপর নির্ভর করে বিভিন্ন ধরণের অবজেক্টকে বোঝায়। যেমন আপনি যদি একটি নতুন ডোমেনওসার্ভেবল নির্মাণ করেন তবে এটি.অজেক্টকন্সট্রাক্টর একটি আলাদা পদ্ধতি অর্থাৎ ডোমেনওভেজারেবল Oঅবজেক্ট কনস্ট্রাক্টরকে বোঝায়; আপনি যদি নতুন অ্যারে অবজার্ভেবল নির্মাণ করছেন, এটি Oঅবজেক্টস কনস্ট্রাক্টর অ্যারেঅবসার্ভেবল.অবজেক্ট কনস্ট্রাক্টরকে বোঝায়।
cobberboy

আমার উত্তর দেখুন, আমি একটি আরও সহজ উদাহরণ পোস্ট করেছেন
মাইকেল লুইস

আমি @ সুইজকে সম্পূর্ণরূপে সম্মত করি; এই উত্তরটি অনেক বেশি করে দিচ্ছে ... আমি কেবল এটি স্কিম করেছিলাম এবং আমি ইতিমধ্যে ক্লান্ত। আমার মনে হচ্ছে "আমি পাঁচ বছরের মতো ব্যাখ্যা করবো এবং সত্যিই প্রস্রাব করতে হবে ..."
স্পাব

4

আপনি যদি আপনার সাবক্লাসে সম্পূর্ণরূপে নির্মাতাকে বাদ দেন তবে আপনি আপনার সাবক্লাসে সুপার () বাদ দিতে পারেন। একটি 'লুকানো' ডিফল্ট কনস্ট্রাক্টর আপনার সাবক্লাসে স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত হবে। তবে আপনি যদি আপনার সাবক্লাসে কনস্ট্রাক্টরকে অন্তর্ভুক্ত করেন তবে সেই কনস্ট্রাক্টরে সুপার () কল করতে হবে।

class A{
   constructor(){
      this.name = 'hello';   
   }
}
class B extends A{
   constructor(){
      // console.log(this.name); // ReferenceError
      super();
      console.log(this.name);
   }
}
class C extends B{}  // see? no super(). no constructor()

var x = new B; // hello
var y = new C; // hello

পড়ুন এই আরও তথ্যের জন্য।


2

ন্যায়বিচারের উত্তরটি সহজতম উপায়, তবে তার উদাহরণটি কিছুটা ফুলে উঠেছে। জেনেরিক সংস্করণটি এখানে:

class Base {
    constructor(){
        return this._constructor(...arguments);
    }

    _constructor(){
        // just use this as the constructor, no super() restrictions
    }
}

class Ext extends Base {
    _constructor(){ // _constructor is automatically called, like the real constructor
        this.is = "easy"; // no need to call super();
    }
}

আসলটি প্রসারিত করবেন না constructor(), কেবল _constructor()তাত্ক্ষণিক যুক্তির জন্য জাল ব্যবহার করুন।

দ্রষ্টব্য, এই সমাধানটি ডিবাগিংটিকে বিরক্তিকর করে তোলে কারণ আপনাকে প্রতিটি ইনস্ট্যান্টেশনের জন্য একটি অতিরিক্ত পদ্ধতিতে পদক্ষেপ নিতে হবে।


হ্যাঁ, এটি এখন পর্যন্ত সবচেয়ে সহজ পদ্ধতি এবং স্পষ্ট উত্তর - আমি যে প্রশ্নটি জিজ্ঞাসা করি তা হ'ল ... "কেন, Godশ্বর, কেন !?" ... সুপার () স্বয়ংক্রিয় না হওয়ার একটি খুব বৈধ কারণ রয়েছে। .. আপনি আপনার বেস ক্লাসে নির্দিষ্ট প্যারামিটারগুলি পাস করতে চাইতে পারেন, তাই বেস ক্লাসটি ইনস্ট্যান্ট করার আগে আপনি কিছু প্রক্রিয়াজাতকরণ / যুক্তি / চিন্তাভাবনা করতে পারেন।
এলএফএলএফএম

1

চেষ্টা করুন:

class Character {
   constructor(){
     if(Object.getPrototypeOf(this) === Character.prototype){
       console.log('invoke character');
     }
   }
}


class Hero extends Character{
  constructor(){
      super(); // throws exception when not called
      console.log('invoke hero');
  }
}
var hero = new Hero();

console.log('now let\'s invoke Character');
var char = new Character();

Demo


এই উদাহরণে আপনি সুপার () ব্যবহার করেন এবং এটি ছেড়ে দিলে আপনার একটি ব্যতিক্রম ছুঁড়ে যায়। সুতরাং আমি মনে করি এই ক্ষেত্রে এই সুপার () কলটি বাদ দেওয়া সম্ভব নয়
xhallix

আমি ভেবেছিলাম আপনার লক্ষ্য পিতামাতাদের নির্বাহককে কার্যকর করা নয়, এই কোডটি এটি করে। প্রসারিত করার সময় আপনি সুপার থেকে মুক্তি পেতে পারবেন না।
জোনাথন ডি এম

বি-বিভ্রান্তিকর জন্য দুঃখিত :) না, আমি কেবল এটি জানতে চেয়েছিলাম যে সুপার () ব্যবহার করা সত্যিই প্রয়োজন কিনা যেহেতু আমি সিনট্যাক্স সম্পর্কে অবাক হয়েছি কারণ অন্যান্য ভাষায় আমরা ডায়রিভুক্ত শ্রেণির জন্য কনস্ট্রাক্টরকে ফোন করার সময় সুপার পদ্ধতিটি গ্রহণ করতে হবে না
xhallix

4
মতে developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... , A constructor *can* use the super keyword to call the constructor of a parent class., তাই আমি বলতে চাই ES6 মুক্তির জন্য অপেক্ষা
জনাথন ডি এম

4
"সুতরাং আমি বলব ES6 মুক্তির জন্য অপেক্ষা করুন" --- এটি ইতিমধ্যে ইতোমধ্যে মুক্তি পেয়েছে
zerkms

1

আমি নিম্নলিখিত ওওপি ধারণাগুলি বিকাশ করতে চাইলে আমি ওওডকে-জেএস ব্যবহার করার পরামর্শ দেব recommend

OODK(function($, _){

var Character  = $.class(function ($, µ, _){

   $.public(function __initialize(){
      $.log('invoke character');
   });
});

var Hero = $.extends(Character).class(function ($, µ, _){

  $.public(function __initialize(){
      $.super.__initialize();
      $.log('invoke hero');
  });
});

var hero = $.new(Hero);
});

1

সহজ সমাধান: আমি মনে করি এটির স্পষ্ট ব্যাখ্যা দেওয়ার দরকার নেই।

class ParentClass() {
    constructor(skipConstructor = false) { // default value is false
        if(skipConstructor) return;
        // code here only gets executed when 'super()' is called with false
    }
}
class SubClass extends ParentClass {
    constructor() {
        super(true) // true for skipping ParentClass's constructor.
        // code
    }
}

উপরের সমস্ত বয়লারপ্লিট কোড কেন আমি নিশ্চিত নই এবং এই পদ্ধতির কোনও পার্শ্ব প্রতিক্রিয়া আছে কিনা তা আমি ঠিক নিশ্চিত নই। এটি কোনও সমস্যা ছাড়াই আমার পক্ষে কাজ করে।
মাইউজারআইনস্ট্যাক ওভারফ্লো

4
একটি ইস্যু: আপনি যদি আবার আপনার সাবক্লাসটি প্রসারিত করতে চান তবে আপনাকে প্রতিটি সাবক্লাসের কনস্ট্রাক্টরে স্কিপ কনস্ট্রাক্টর বৈশিষ্ট্যটি তৈরি করতে হবে
মাইকেল লুইস

1

@ বার্গি উল্লেখ করেছেন new.target.prototype, তবে আমি একটি দৃ concrete় উদাহরণের সন্ধান করছিলাম যা প্রমাণ করে যে আপনি অ্যাক্সেস করতে পারবেন this(বা আরও ভাল, ক্লায়েন্ট কোডটি যে বস্তুর সাথে তৈরি করছে newতা নীচে দেখুন) কোনও কল না করেই অ্যাক্সেস করতে পারবেন super()

টক সস্তার, আমাকে কোডটি দেখান ... সুতরাং এখানে একটি উদাহরণ রয়েছে:

class A { // Parent
    constructor() {
        this.a = 123;
    }

    parentMethod() {
        console.log("parentMethod()");
    }
}

class B extends A { // Child
    constructor() {
        var obj = Object.create(new.target.prototype)
        // You can interact with obj, which is effectively your `this` here, before returning
        // it to the caller.
        return obj;
    }

    childMethod(obj) {
        console.log('childMethod()');
        console.log('this === obj ?', this === obj)
        console.log('obj instanceof A ?', obj instanceof A);
        console.log('obj instanceof B ?',  obj instanceof B);
    }
}

b = new B()
b.parentMethod()
b.childMethod(b)

যা আউটপুট দেবে:

parentMethod()
childMethod()
this === obj ? true
obj instanceof A ? true
obj instanceof B ? true

সুতরাং আপনি দেখতে পাচ্ছেন যে আমরা কার্যকরভাবে টাইপের একটি অবজেক্ট B(শিশু শ্রেণি) তৈরি করছি যা টাইপের একটি অবজেক্ট A(এর প্যারেন্ট ক্লাস) এবং childMethod()সন্তানের মধ্যে Bআমরা বি এর সাহায্যে তৈরি হওয়া thisসেই বস্তুর প্রতি ইঙ্গিত করছি ।objconstructorObject.create(new.target.prototype)

এবং এগুলি মোটেও চিন্তা superকরে না।

বাস্তবে দেখা যায় যে জাতীয় একটি লিভারেজ constructorযখন ক্লায়েন্ট কোড সহ একটি নতুন উদাহরণ নির্মান একটি সম্পূর্ণ ভিন্ন বস্তুর আসতে পারেন new

আশা করি এটি কাউকে সাহায্য করবে।

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