PDA

View Full Version : سوال: اشکال در کلاس انتزاعی برای یک کارمند



p30_code
چهارشنبه 04 اردیبهشت 1392, 22:12 عصر
با سلام و خسته نباشید کد من به اینصورت هست که مشخصات یک کارمند و حداقل حقوق آن را گرفته که در واقع محاسبه حقوق و بیمه و مالیات را با استفاده از کلاس انتزاعی می باشد لطفا بررسی کنید که راه حل بهتر و یا مشکل این کد که چگونه باید برطرف کنم.باتشکر
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
abstract class person
{
private long id;
private string name;
private double net;

public person(long id, string name)
{
this.id = id;
this.name = name;
}

public abstract void Net();

public void print()
{
Console.WriteLine("id={0}\t name={1}\t net={2}", id, name, net);
}

}
class emplyee : person
{
public override void Net(double paye, double bime, double maliat, double sharet, double net)
{

bime = paye * bime / 100;
maliat = paye * maliat / 100;
net = paye - bime - maliat + sharet;

}
}



class Program
{
static void Main(string[] args)
{
person p = new person(100,"ali");
p.print();
emplyee e = new emplyee(10, 20, 30, 40, 50);
e.Net();
e.print();



Console.ReadKey();
}
}
}

p30_code
پنج شنبه 05 اردیبهشت 1392, 19:31 عصر
سلام .کسی نیست که مشکل ام را بررسی کنه. با تشکر:گریه:

tooraj_azizi_1035
پنج شنبه 05 اردیبهشت 1392, 20:00 عصر
سلام
چرا از abstract در تعریف person استفاده کردید؟ abstract در اینجا بی معنی است.
شما میخوای خالص دریافتی یک کارمند رو محاسبه کنی هر شخصی در جامعه الزاماً شاغل نیست که خالص دریافتی هم داشته باشد!
شما با تعریف متد Net به طور انتزاعی گفتید که همه خالص دریافتی دارند، این در مورد یک "مدیر عامل" صادق نیست.
وقتی کلاسی مثل Manager از person مشتق می شود، باید متد Net را پیاده سازی کند در حالی که او حقوق میدهد!
وجود این متد و متد print فقط در کلاس کارمند باید باشد.

p30_code
پنج شنبه 05 اردیبهشت 1392, 21:40 عصر
عزیزم من خودمم می دونم میشه بدون abstract نوشت , اما از اونجایی که این برنامه رو استادمون از ما خواسته و تاکید کرده که با abstraction ایجاد میشه , این بود که این تاپیک رو ایجاد کردم , لطفا این برنامه رو با abstract اصلاح کنید .


بازم ممنون بابت پاسختون .

wolf_majid
پنج شنبه 05 اردیبهشت 1392, 22:40 عصر
abstract class person
{
private long id;
private string name;
public double net { set; get; }

public person(long id, string name)
{
this.id = id;
this.name = name;
}

public abstract void Net(double paye, double bime, double maliat, double sharet);

public void print()
{
Console.WriteLine("id={0}\t name={1}\t net={2}", id, name, net);
}

}

class emplyee : person
{
public emplyee(long id, string name) : base(id, name)
{
}

public override void Net(double paye, double bime, double maliat, double sharet)
{
bime = paye * bime / 100;
maliat = paye * maliat / 100;
base.net = paye - bime - maliat + sharet;
}
}

class Program
{
static void Main(string[] args)
{
emplyee p = new emplyee( 100, "ali");
p.print();
p.Net(10, 20, 30, 40);
p.print();
Console.ReadKey();
}
}

p30_code
پنج شنبه 05 اردیبهشت 1392, 22:40 عصر
در واقع من این کد را در قالب پلی مورفیسم abstraction در بیارم.

p30_code
پنج شنبه 05 اردیبهشت 1392, 22:48 عصر
دوست عزیز تشکر ار راهنمایی تون حالا من اگه بخواهم با یک کلاس این کار را انجام بدم به چه صورت میشه. در واقع person نباشه employee فقط باشه ایا این امکان اش هست.

wolf_majid
پنج شنبه 05 اردیبهشت 1392, 23:17 عصر
برای کد اولتون بله امکانش هست اما دیگه abstract معنی نخواهد داشت

p30_code
پنج شنبه 05 اردیبهشت 1392, 23:37 عصر
دوست عزیز abstract زمانی استفاده می شود که ما چند کلاس داشته باشیم و بخواهیم از آن ارث و چند ریختی انجام بدهیم .آیا منظور شما همین بود.در یک کلاس معنی خاصی نمیدهد.

wolf_majid
پنج شنبه 05 اردیبهشت 1392, 23:59 عصر
دوست عزیز abstract زمانی استفاده می شود که ما چند کلاس داشته باشیم و بخواهیم از آن ارث و چند ریختی انجام بدهیم .آیا منظور شما همین بود.در یک کلاس معنی خاصی نمیدهد.

از کلاس های abstract نمیشه نمونه سازی کرد و فقط برای ارث بری استفاده میشن (معمولا" برای استاندارد سازی) , پس زمانی که یک کلاس داشته باشین علنا" abstract کردن اون برابر با غیر قابل استفاده کردن اونه