কিভাবে আমি এটি করতে পারব:
public class Main extends ListActivity , ControlMenu
এছাড়াও, আমি জানতে চাই যে এই পদ্ধতিটি ঠিক আছে যে আমি ক্লাসে মেনু তৈরি করেছি যা কন্ট্রোলমেনু এবং আমি অন্যান্য ক্রিয়াকলাপগুলিতে প্রসারিত করছি।
কিভাবে আমি এটি করতে পারব:
public class Main extends ListActivity , ControlMenu
এছাড়াও, আমি জানতে চাই যে এই পদ্ধতিটি ঠিক আছে যে আমি ক্লাসে মেনু তৈরি করেছি যা কন্ট্রোলমেনু এবং আমি অন্যান্য ক্রিয়াকলাপগুলিতে প্রসারিত করছি।
উত্তর:
আপনি কেবল একটি একক শ্রেণি প্রসারিত করতে পারেন। এবং অনেক উত্স থেকে ইন্টারফেস প্রয়োগ করুন।
একাধিক ক্লাস প্রসারিত পাওয়া যায় না। আমি কেবলমাত্র সমাধানটি বর্গের উত্তরাধিকার হিসাবে নয় বরং প্রতিটি শ্রেণীর অভ্যন্তরীণ ভেরিয়েবল থাকা এবং আপনার বস্তুর কাছে অনুরোধগুলি যে বস্তুতে যেতে চাইছে সেটিকে পুনর্নির্দেশের মাধ্যমে আরও কিছু প্রক্সি করা is
public class CustomActivity extends Activity {
private AnotherClass mClass;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mClass = new AnotherClass(this);
}
//Implement each method you want to use.
public String getInfoFromOtherClass()
{
return mClass.getInfoFromOtherClass();
}
}
এটিই আমি নিয়ে এসেছি সেরা সমাধান। আপনি উভয় শ্রেণি থেকে কার্যকারিতা পেতে পারেন এবং তবুও কেবল আসলে এক শ্রেণির হতে পারে।
অপূর্ণতাটি হ'ল আপনি একটি usingালাই ব্যবহার করে অভ্যন্তরীণ শ্রেণির ছাঁচে ফিট করতে পারবেন না।
কেন অভ্যন্তর শ্রেণি ব্যবহার করবেন না (বাসা)
class A extends B {
private class C extends D {
//Classes A , B , C , D accessible here
}
}
Fragment। আমার ক্রিয়াকলাপটি অবশ্যই প্রসারিত হবে Fragment, যার অর্থ আমার একেবারে প্রয়োজন getView(), যা এটি অভ্যন্তরীণ শ্রেণীর অভ্যন্তরে থাকলে কাজ করবে না এবং সেখানে কোডটি যেখানে আমার কোড ব্যবহার করা দরকার ListActivity, তাই আমি দুবার প্রসারিত করতে পারি না, বা কোনও অভ্যন্তর শ্রেণি করতে পারি না এই উদাহরণে।
যেমনটি সবাই বলেছেন। না, আপনি পারবেন না। যদিও বছরের পর বছর ধরে লোকেরা বহুবার বলেছে যে আপনার একাধিক ইন্টারফেস ব্যবহার করা উচিত তারা কীভাবে বাস্তবে যায় নি। আশা করি এটি সাহায্য করবে।
বলুন যে আপনার আছে class Fooএবং class Barআপনি উভয়ই একটিতে প্রসারিত করার চেষ্টা করতে চান class FooBar। অবশ্যই, আপনি যেমন বলেছিলেন, আপনি এটি করতে পারবেন না:
public class FooBar extends Foo, Bar
মানুষ এর জন্য ইতিমধ্যে কিছু পরিমাণে কারণগুলিতে চলে গেছে। পরিবর্তে, interfacesউভয়ের জন্য লিখুন Fooএবং Barতাদের সমস্ত পাবলিক পদ্ধতি আবরণ। যেমন
public interface FooInterface {
public void methodA();
public int methodB();
//...
}
public interface BarInterface {
public int methodC(int i);
//...
}
এবং এখন আপেক্ষিক ইন্টারফেসগুলি তৈরি Fooএবং Barপ্রয়োগ করুন:
public class Foo implements FooInterface { /*...*/ }
public class Bar implements BarInterface { /*...*/ }
এখন, সঙ্গে class FooBar, আপনি উভয় বাস্তবায়ন করতে পারেনFooInterface এবং BarInterfaceএকটি Fooএবং Barঅবজেক্ট রাখার সময় এবং কেবল পদ্ধতিগুলি সোজা করার মাধ্যমে:
public class FooBar implements FooInterface, BarInterface {
Foo myFoo;
Bar myBar;
// You can have the FooBar constructor require the arguments for both
// the Foo and the Bar constructors
public FooBar(int x, int y, int z){
myFoo = new Foo(x);
myBar = new Bar(y, z);
}
// Or have the Foo and Bar objects passed right in
public FooBar(Foo newFoo, Bar newBar){
myFoo = newFoo;
myBar = newBar;
}
public void methodA(){
myFoo.methodA();
}
public int methodB(){
return myFoo.methodB();
}
public int methodC(int i){
return myBar.methodC(i);
}
//...
}
এই পদ্ধতির জন্য বোনাস, এটি FooBar বস্তু উভয়ের ছাঁচ ফিট FooInterfaceএবং BarInterface। এর অর্থ এটি পুরোপুরি ঠিক আছে:
FooInterface testFoo;
testFoo = new FooBar(a, b, c);
testFoo = new Foo(a);
BarInterface testBar;
testBar = new FooBar(a, b, c);
testBar = new Bar(b, c);
আশা করি এটি একাধিক এক্সটেনশানের পরিবর্তে ইন্টারফেসগুলি কীভাবে ব্যবহার করবে তা স্পষ্ট করে। আমি কয়েক বছর দেরি হলেও।
আপনি ইন্টারফেস ব্যবহার করতে চাইবেন। সাধারণত, ডায়মন্ড সমস্যার কারণে একাধিক উত্তরাধিকার খারাপ:
abstract class A {
abstract string foo();
}
class B extends A {
string foo () { return "bar"; }
}
class C extends A {
string foo() {return "baz"; }
}
class D extends B, C {
string foo() { return super.foo(); } //What do I do? Which method should I call?
}
সি ++ এবং অন্যদের কাছে এটি সমাধানের কয়েকটি উপায় রয়েছে, যেমন
string foo() { return B::foo(); }
তবে জাভা কেবল ইন্টারফেস ব্যবহার করে।
ইন্টারফেসে জাভা ট্রেলগুলির দুর্দান্ত ভূমিকা রয়েছে: http://download.oracle.com/javase/tutorial/java/concepts/interface.html আপনি সম্ভবত এন্ড্রয়েড এপিআইতে সবিস্তারে ডুব দেওয়ার আগে এটি অনুসরণ করতে চান।
virtual class। কম্পাইলার এবং বিকাশকারী উভয়ের জন্য এটি করা অনেক সতর্কতা এবং সতর্কতা সহ আসে।
superউত্তরাধিকার সূত্রে প্রাপ্ত কোনও পদ্ধতিতে কল করবেন না । ঠিক আছে, আপনি পারেন তবে আপনাকে অনুরোধ করার জন্য ইন্টারফেস পদ্ধতিটি নির্দিষ্ট করতে হবে (এবং এটি অবশ্যই defaultইন্টারফেস প্রয়োগের ক্ষেত্রে কীওয়ার্ডটি ব্যবহার করতে হবে ) । একটি উদাহরণ হ'ল: MyIFace.super.foo()যেখানে মাইফেস একটি ইন্টারফেস। আপনি দেখতে পাচ্ছেন এক্সিকিউট করার জন্য ইন্টারফেসের পদ্ধতিটি সংজ্ঞায়িত করা হয়েছে এবং ডায়মন্ড সমস্যা সম্পূর্ণভাবে এড়িয়ে চলে। যদি আপনি প্রসারিত করেন MyClass1এবং MyClass2, উভয় শ্রেণীর একটি থাকে foo(), এবং কল করেন super.foo()তবে সংকলকটি হীরা সমস্যা দ্বারা নিক্ষেপ করা হবে।
"bar"বা "baz"পদ্ধতি ধরণের সাথে void। যাইহোক, ভাল ব্যাখ্যা এক্সডি
হ্যাঁ, সবাই যেমন লিখেছেন, আপনি জাভাতে একাধিক উত্তরাধিকার করতে পারবেন না। আপনার যদি দুটি ক্লাস থাকে যা থেকে আপনি কোডটি ব্যবহার করতে চান, আপনি সাধারণত কেবল একটি সাবক্লাস (ক্লাস বলুন A) করুন। শ্রেণীর জন্য B, আপনি এটির গুরুত্বপূর্ণ পদ্ধতিগুলি একটি ইন্টারফেসে BInterface(কুৎসিত নাম, তবে আপনি ধারণাটি পেয়েছেন) এ বিমূর্ত করে , তারপরে বলুন Main extends A implements BInterface। ভিতরে, আপনি শ্রেণীর কোনও অবজেক্ট ইনস্ট্যান্ট করতে Bএবং BInterfaceএর সম্পর্কিত ফাংশনগুলিকে কল করে সমস্ত পদ্ধতি বাস্তবায়ন করতে পারেনB ।
এটি " Mainএখনকার একটি" সম্পর্কের সাথে "হ'ল-এ" সম্পর্কের পরিবর্তন করে কারণ আপনার এখনকার একটি Aতবে এর একটি রয়েছে B। আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে আপনি এমনকি BInterfaceআপনার Aশ্রেণি থেকে অপসারণ করে সেই পরিবর্তনটি স্পষ্ট করে তুলতে পারেন এবং পরিবর্তে আপনার বি অবজেক্টটি সরাসরি অ্যাক্সেস করার জন্য একটি পদ্ধতি সরবরাহ করতে পারেন।
একটি ইন্টারফেস তৈরি করুন। জাভার একাধিক উত্তরাধিকার নেই।
http://csis.pace.edu/~bergin/patterns/multipleinheritance.html
জাভা একাধিক উত্তরাধিকার সমর্থন করে না, তবে আপনি দুটি বা ততোধিক ইন্টারফেস প্রয়োগের চেষ্টা করতে পারেন।
অন্য বিকল্পের মতো, সম্ভবত আপনি কোনও পদ্ধতির ডিফল্ট প্রয়োগের সাথে একটি ইন্টারফেস ব্যবহার করতে পারেন। এটি অবশ্যই আপনি যা করতে চান তা নির্ভর করে।
উদাহরণস্বরূপ, আপনি একটি বিমূর্ত শ্রেণি এবং একটি ইন্টারফেস তৈরি করতে পারেন:
public abstract class FatherClass {
abstract void methodInherit() {
//... do something
}
}
public interface InterfaceWithDefaultsMethods {
default void anotherMethod() {
//... do something
//... maybe a method with a callable for call another function.
}
}
সুতরাং, এর পরে, আপনি উভয় ক্লাস প্রসারিত এবং প্রয়োগ করতে পারেন এবং উভয় পদ্ধতি ব্যবহার করতে পারেন।
public class extends FatherClass implements InterfaceWithDefaultsMethods {
void methode() {
methodInherit();
anotherMethod();
}
}
আশা করি এটি আপনাকে সহায়তা করবে ...
জাভাতে একাধিক ক্লাস থেকে প্রসারিত করার অনুমতি নেই .. মারাত্মক হীরা রোধ করতে !
এটা সম্ভব
public class ParallaxViewController<T extends View & Parallaxor> extends ParallaxController<T> implements AbsListView.OnScrollListener {
//blah
}
Parallaxorএবং ParallaxControllerঅজানা, সুতরাং আমি ধরে নিই যে তারা এসডিকে-ক্লাস নয়। সুতরাং এটি আমার পক্ষে কাজ করে না (এবং এই উত্তরটি ত্রুটিগুলি দেখায়)। প্যারালাক্সকন্ট্রোলার কী? এটি কি একটি নির্দিষ্ট নির্ভরতা? দয়া করে বিশদভাবে বলুন
জাভা নির্মাতারা সিদ্ধান্ত নিয়েছিলেন যে একাধিক উত্তরাধিকারের সমস্যাগুলি সুবিধার চেয়ে বেশি, তাই তারা একাধিক উত্তরাধিকার অন্তর্ভুক্ত করেনি। আপনি একাধিক উত্তরাধিকারের বৃহত্তম সমস্যা (ডাবল হীরা সমস্যা) সম্পর্কে এখানে পড়তে পারেন ।
দুটি সর্বাধিক অনুরূপ ধারণাগুলি হ'ল ইন্টারফেস বাস্তবায়ন এবং বর্তমান শ্রেণীর সদস্য হিসাবে অন্যান্য শ্রেণীর অবজেক্টগুলি অন্তর্ভুক্ত। ইন্টারফেসে ডিফল্ট পদ্ধতি ব্যবহার করা একাধিক উত্তরাধিকার হিসাবে প্রায় একই, তবে কেবলমাত্র ডিফল্ট পদ্ধতিতে ইন্টারফেস ব্যবহার করা খারাপ অভ্যাস হিসাবে বিবেচিত হয়।
আপনি জাভা একাধিক উত্তরাধিকার করতে পারবেন না। ইন্টারফেস ব্যবহার বিবেচনা করুন:
interface I1 {}
interface I2 {}
class C implements I1, I2 {}
বা অভ্যন্তরীণ শ্রেণী:
class Outer {
class Inner1 extends Class1 {}
class Inner2 extends Class2 {}
}