Polymorphism
Удамшлаар дамжин class нь нэг төрлөөс илүү хэрэглэгдэж болно. Ингэж хэрэглэгдэхдээ өөрийн гэсэн нэг төрөл, суурь классын төрөл, эсвэл хэрвээ интерфейсийг хөгжүүлж байгаа бол интерфейсийн төрөл маягаар гэх мэтчилэн олон хэлбэрээр хэрэглэгдэж болно. Үүнийг polymorphism гэдэг. Энэхүү polymorphism гэх үгийн “poly” нь “олон”, “morphism” нь “хэлбэр” гэсэн утгатай ба нийлвэл “олон хэлбэр” болж байгаа юм. C# хэлэнд төрөл бүр polymorphism шинжтэй байдаг. Төрлүүд нь өөрийн гэсэн төрөл, эсвэл объект instance маягаар ашиглагдаж болох ба учир нь ямар ч төрөл автоматаар объекттэй суурь төрөл мэтээр харьцдаг.
Polymorphism нь дан ганц удамшсан классуудад чухал бус, мөн эх классуудад нь ч гэсэн чухал байдаг. Суурь классыг хэрэглэж байгаа хэн ч гэсэн тухайн классаас удамшсан классын объект instance-г ашиглаж байж болно. Суурь классын дизайнерууд удамшсан классад өөрчлөгдөх магадлалтай суурь классын шинжүүдийг таамаглаж байдаг. Жишээ нь машинуудад зориулсан суурь класс нь машин нь пургон юмуу дээвэр нь онгойдог машин байх тохиолдолд өөр байх шинжүүдийг агуулж байдаг. Суурь класс нь энэхүү классын гишүүдийг virtual гэж тэмдэглэж болох ба тэгснээр пургон болон дээвэр нь онгойдог машинуудыг төлөөлсөн удамшсан класс нь тухайн шинж чанарыг өөрсөддөө тааруулан дахин тодорхойлж болно.
Суурь классаас класс удамшуулахад удамшсан класс нь суурь классынхаа бүх л method, field, properties болон event-уудыг удамшуулан авдаг. Суурь классын өгөгдөл болон үйлдлийг өөрчлөх хоёр боломж байгаа. Нэг нь суурь классын гишүүнийг шинэ гишүүнээр орлуулж, replace хийж болох ба нөгөө нь суурь классын virtual гишүүнийг дахин тодорхойлж болно.
Суурь классын гишүүнийг new гэсэн түлхүүр үг ашиглан сольдог. Хэрвээ суурь класс нь method, field, property тодорхойлж өгсөн new гэсэн түлхүүр үг нь эдгээр method, field, property-н шинэ тодорхойлолт үүсгэхэд хэрэглэгддэг. new түлхүүр үг нь солигдож байгаа буцах классын гишүүний буцах төрлийн өмнө бичигддэг .Жишээ нь:
public class BaseClass
{
public void DoWork() { }
public int WorkField;
public int WorkProperty
{
get { return 0; }
}
}
public class DerivedClass : BaseClass
{
public new void DoWork() { }
public new int WorkField;
public new int WorkProperty
{
get { return 0; }
}
}
Delegate
Delegate-г функцийн заагч хэмээн ойлгож болно. Програмыг кодчилон хөгжүүлж байх үед чухам аль функц дуудагдах нь мэдэгдэхгүй,харин програм ажиллах үед функцыг сонгох тохиолдолд delegate-г хэрэглэгдэнэ. Delegate нь delegate-н класс,энэ классын объект гэсэн хоёр хэсгээс тогтоно. Delegate-н классыг зарласны дараа энэ классын объектыг үүсгэж болох ба үүнийг функц дуудах,хадгалахад хэрэглэж болно. Delegate төрөл доорх 3 төрлийн мэдээллийг агуулж байдаг: дуудагдах функцийн нэр, энэ функцийн аргумент, энэ функцийн буцаах утга.
Delegate дээр дурдсан мэдээллийг агуулж,үүссэн л бол ажиллах явцдаа заагч(pointer)-аа дууддаг. Delegate үүсгэхэд delegate түлхүүр үгийг хэрэглэнэ. Delegate-н нэр юу ч байж болох ч энэ delegate-г заах функцийн доторхтой давхцаж байх ёстой. Одоо delegate-г ашигласан жишээ авч үзье.
using System;
public class SamplesDelegate {
// Declares a delegate for a method that takes in an int and returns a String.
public delegate String myMethodDelegate( int myInt );
// Defines some methods to which the delegate can point.
public class mySampleClass {
// Defines an instance method.
public String myStringMethod ( int myInt ) {
if ( myInt > 0 )
return( "positive" );
if ( myInt < 0 )
return( "negative" );
return ( "zero" );
}
// Defines a static method.
public static String mySignMethod ( int myInt ) {
if ( myInt > 0 )
return( "+" );
if ( myInt < 0 )
return( "-" );
return ( "" );
}
}
public static void Main() {
// Creates one delegate for each method. For the instance method, an
// instance (mySC) must be supplied. For the static method, use the
// class name.
mySampleClass mySC = new mySampleClass();
myMethodDelegate myD1 = new myMethodDelegate( mySC.myStringMethod );
myMethodDelegate myD2 = new myMethodDelegate( mySampleClass.mySignMethod );
// Invokes the delegates.
Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", 5, myD1( 5 ), myD2( 5 ) );
Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", -3, myD1( -3 ), myD2( -3 ) );
Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", 0, myD1( 0 ), myD2( 0 ) );
}
}
Үр дүн нь:
5 is positive; use the sign "+".
-3 is negative; use the sign "-".
0 is zero; use the sign "".
Abstract
Abstract гэдэг нь хийсвэр гэсэн Англи үг. Хийсвэр, ерөнхий класс учраас бодитоор хэрэглэх боломжгүй. Тийм учраас хийсвэр классыг түүнийг удамшуулж хэрэглэдэг. Abstract modified-г класс, method, properties, indexer болон үзэгдлүүдтэй хамт хэрэглэж болно. Abstract modifier классын тодорхойлолтонд тухайн класс нь бусад классуудын суурь класс байна гэдгийг зааж өгөхийн тулд хэрэглэдэг. Abstract гэж тэмдэглэгдсэн гишүүн, эсвэл abstract классын гишүүн бол тэд abstract классаас үүсж байгаа классаар implement хийгдэх боломжтой.
Энэ жишээнд Square гэх класс нь Area-г implementation хийхэд туслах зорилготой, учир нь энэ ShapesClass-аас үүссэн.
abstract class ShapesClass
{
abstract public int Area();
}
class Square : ShapesClass
{
int x, y;
// Not providing an Area method results
// in a compile-time error.
public override int Area()
{
return x * y;
}
}
Интерфейс
Интерфейс нь зөвхөн method, delegate, event-үүдийн бичлэгүүдийг агуулж байдаг. Method-уудын implementation нь дараах жишээнд харуулсан шиг интерфейсийг implement хийдэг классд хийгддэг.
interface ISampleInterface
{
void SampleMethod();
}
class ImplementationClass : ISampleInterface
{
// Explicit interface member implementation:
void ISampleInterface.SampleMethod()
{
// Method implementation.
}
static void Main()
{
// Declare an interface instance.
ISampleInterface obj = new ImplementationClass();
// Call the member.
obj.SampleMethod();
}
}
Subscribe to:
Post Comments (Atom)

No comments:
Post a Comment