আমি বিশ্বাস করি যে ইন্টারফেস এবং বেস ক্লাসগুলির সংমিশ্রণটি ব্যবহার করা আপনার পক্ষে কাজ করতে পারে। এটি সংকলনের সময় আচরণগত প্রয়োজনীয়তা প্রয়োগ করবে (rq_ পোস্ট "নীচে" উপরের পোস্টকে বোঝায়, যা এটি নয়)।
ইন্টারফেসটি এমন আচরণগত এপিআই সেট করে যা বেস ক্লাসে পূরণ হয় না। আপনি ইন্টারফেসে সংজ্ঞায়িত পদ্ধতিগুলিতে কল করতে বেস ক্লাসের পদ্ধতিগুলি সেট করতে সক্ষম হবেন না (কারণ আপনি সেই আচরণগুলি সংজ্ঞায়িত না করে বেস শ্রেণিতে সেই ইন্টারফেসটি প্রয়োগ করতে সক্ষম হবেন না)। পিতা-মাতার মধ্যে ইন্টারফেসের পদ্ধতিগুলি কল করার জন্য কেউ নিরাপদ কৌশল নিয়ে আসতে পারেন ।
আপনাকে ক্লাসে প্রসারিত এবং বাস্তবায়ন করতে হবে যা আপনি ইনস্ট্যান্ট করবেন। এটি রানটাইম-ব্যর্থ কোড সংজ্ঞায়নের বিষয়ে উদ্বেগকে সন্তুষ্ট করে। আপনি যদি ইন্টারফেসটি প্রয়োগ না করে থাকেন তবে এমন পদ্ধতিগুলি কল করতেও সক্ষম হবেন না (যেমন আপনি প্রাণী শ্রেণিকে ইনস্ট্যান্ট করার চেষ্টা করেছেন)। আমি নীচের বেসঅনিমালটি প্রসারিত করার জন্য ইন্টারফেসটি দেওয়ার চেষ্টা করেছি, তবে এটি স্নেক থেকে বেসঅনিমালের কনস্ট্রাক্টর এবং 'নাম' ক্ষেত্রটি আড়াল করেছে। যদি আমি এটি করতে সক্ষম হয়েছি তবে মডিউল এবং রফতানি ব্যবহার বেসঅ্যানিমাল শ্রেণীর দুর্ঘটনাজনিত প্রত্যক্ষ তাত্পর্য প্রতিরোধ করতে পারে।
এটি আপনার জন্য কাজ করে কিনা তা এখানে আটকান: http://www.tyypecriptlang.org/Playground/
// The behavioral interface also needs to extend base for substitutability
interface AbstractAnimal extends BaseAnimal {
// encapsulates animal behaviors that must be implemented
makeSound(input : string): string;
}
class BaseAnimal {
constructor(public name) { }
move(meters) {
alert(this.name + " moved " + meters + "m.");
}
}
// If concrete class doesn't extend both, it cannot use super methods.
class Snake extends BaseAnimal implements AbstractAnimal {
constructor(name) { super(name); }
makeSound(input : string): string {
var utterance = "sssss"+input;
alert(utterance);
return utterance;
}
move() {
alert("Slithering...");
super.move(5);
}
}
var longMover = new Snake("windy man");
longMover.makeSound("...am I nothing?");
longMover.move();
var fulture = new BaseAnimal("bob fossil");
// compile error on makeSound() because it is not defined.
// fulture.makeSound("you know, like a...")
fulture.move(1);
নীচে লিঙ্কিত হিসাবে আমি ফ্রিস্টওয়ান ক্যাম্পেনের উত্তর জুড়ে এসেছি। তিনি বলেন যে বিমূর্ত শ্রেণিগুলি একটি অ্যান্টি-প্যাটার্ন, এবং পরামর্শ দেয় যে একটি ইনস্ট্যান্টিয়েট বেস 'অ্যাবস্ট্রাক্ট' ক্লাস প্রয়োগকারী শ্রেণীর ইনজেকশন উদাহরণ ব্যবহার করে। এটি ন্যায়সঙ্গত, তবে পাল্টা যুক্তি রয়েছে। নিজের জন্য পড়ুন:
https://typescript.codeplex.com/discussion/449920
পার্ট 2: আমার আরও একটি মামলা ছিল যেখানে আমি একটি বিমূর্ত শ্রেণি চেয়েছিলাম, কিন্তু আমার উপরের সমাধানটি ব্যবহার করা থেকে আমাকে বাধা দেওয়া হয়েছিল, কারণ "অ্যাবস্ট্রাক্ট ক্লাস" এ সংজ্ঞায়িত পদ্ধতিগুলির সাথে ম্যাচিং ইন্টারফেসে সংজ্ঞায়িত পদ্ধতিগুলি উল্লেখ করা দরকার। সুতরাং, আমি ফ্রাইস্টওয়ান ক্যাম্পেনের পরামর্শটি সাজাই, সাজিয়েছি। পদ্ধতি প্রয়োগের সাথে আমার অসম্পূর্ণ "বিমূর্ত" শ্রেণি রয়েছে। আনপ্লেসমেন্টেড পদ্ধতিগুলির সাথে আমার ইন্টারফেস রয়েছে; এই ইন্টারফেসটি "বিমূর্ত" শ্রেণি প্রসারিত করে। আমার তখন একটি ক্লাস রয়েছে যা প্রথমটি প্রসারিত করে এবং দ্বিতীয়টি প্রয়োগ করে (এটি উভয়ই প্রসারিত করতে হবে কারণ অন্যথায় সুপার কনস্ট্রাক্টর অ্যাক্সেসযোগ্য)। নীচে (চালানো যায় না) নমুনা দেখুন:
export class OntologyConceptFilter extends FilterWidget.FilterWidget<ConceptGraph.Node, ConceptGraph.Link> implements FilterWidget.IFilterWidget<ConceptGraph.Node, ConceptGraph.Link> {
subMenuTitle = "Ontologies Rendered"; // overload or overshadow?
constructor(
public conceptGraph: ConceptGraph.ConceptGraph,
graphView: PathToRoot.ConceptPathsToRoot,
implementation: FilterWidget.IFilterWidget<ConceptGraph.Node, ConceptGraph.Link>
){
super(graphView);
this.implementation = this;
}
}
এবং
export class FilterWidget<N extends GraphView.BaseNode, L extends GraphView.BaseLink<GraphView.BaseNode>> {
public implementation: IFilterWidget<N, L>
filterContainer: JQuery;
public subMenuTitle : string; // Given value in children
constructor(
public graphView: GraphView.GraphView<N, L>
){
}
doStuff(node: N){
this.implementation.generateStuff(thing);
}
}
export interface IFilterWidget<N extends GraphView.BaseNode, L extends GraphView.BaseLink<GraphView.BaseNode>> extends FilterWidget<N, L> {
generateStuff(node: N): string;
}