1) همونطور که Constructor موقع ایجاد یک شی فراخوانی میشه و در اون Constructor شی میتونه عملیات مورد نیاز رو انجام بده. اگه منظورتون تفاوت بین این دو حالت هست:
class Foo {
private int value;
public Foo(int value) {
this.value = value;
}
public int Value {
get {
return this.value;
}
set {
this.value = value;
}
}
}
..
..
Foo obj = new Foo(10);
/////////////////////////////////////////
class Foo {
private int value;
public Foo() {
}
public int Value {
get {
return this.value;
}
set {
this.value = value;
}
}
}
..
..
Foo obj = new Foo() {
Value = 10,
};
ممکنه نوع طراحی کلاس طوری باشه، که برای معتبر بودن شی در طی طول عمرش، حتما نیاز به پارامترهایی در سازنده داشته باشه. برای مثال، کلاس FileStream رو در نظر بگیرید، این کلاس یک سازنده پیشفرض نداره و ایجاد یک شی فقط از طریق پارامترهای سازنده، امکان پذیر هست. بررسی معتبر بودن پارامترها، باز کردن فایل و ... همه در سازنده انجام میشه.
FileStream fs = new FileStream(@"d:\temp\file.txt", FileAccess.Read);
و اصلا مشخصه FileName یا چیزی شبیه این براش در نظر گرفته نشده که شما بخوای به روش دیگری از کلاس استفاده کنی. در طراحی این کلاس در نظر گرفته شده که هر شی فقط و فقط مربوط به یک فایل هست. حداقل یک علت این موضوع ساده کردن طراحی و کار با کلاس هست. نه تنها هر شی فقط برای یک فایل هست، وضعیت هر شی از زمان ایجاد کلاس، در حالت باز (open) هست، تا زمانی که بسته بشه و در وضعیت (close) قرار بگیره. این هم سادگی رو نتیجه میده. بر اساس این طراحی، Constructor پیشفرضی در نظر گرفته نشده چون با این نیازها سازگار نیست. البته به این معنی نیست که نمیشه یک کلاس FileStream به شکل دیگری نوشت.
2) اول اینکه Inerhit کردن کلاس A از کلاس B در صورتی منطقی هست که عبارت "A یک B است" صحیح باشه. دوم اینکه Inherit کردن پیچیدگی هایی ایجاد میکنه که تا زمانی که واقعا نیازی به این کار نباشه نباید استفاده بشه. سوم اینجه در زبانی مثل #C هر کلاس از فقط یک کلاس دیگه میتونه مشتق بشه.
3) منظورتون رو درست متوجه نشدم.
برای متوجه شدن بهتر شئ گرایی کتاب زیاد هست میتونید مطالعه کنید. بخشی از مطالبی که گفتم از بخش 6.3 کتاب Code Compelete 2nd Edition بود. البته کتاب های مختص شی گرایی هم زیاد هستن.