PDA

View Full Version : تفاوت کاربردی interface با متد abstract استفاده شده در کلاس های abstract



amirjalili
یک شنبه 16 فروردین 1388, 10:47 صبح
با سلام خدمت دوستان..
تفاوت کاربردی interface با متد abstract استفاده شده در کلاس های abstract چیه؟
این دو بسیار شبیه هم هستند..
نمیدونم کجا از هر کدوم از این ها استفاده میشه؟

ASKaffash
یک شنبه 16 فروردین 1388, 11:12 صبح
سلام
چند ماه قبل اختلاف آنها را به شکل ذیل در C# در آوردم شاید بدردت بخورد (با سورس ذیل نیز تست کردم)


1- instance : interface=ok , abstract class=no

2- access modifier : interface=no , abstract class=ok

3- define member ---+ : interface=is abstract , abstract class=ok
+----> (method,property,indexer) (all members and no abstract)
4- inheritance from class : interface=no , abstract class=ok
---------------------------------------------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UML
{
public class test
{
void m()
{
Y<int> y = new Y<int>(0);
Z1<int> z1 = (Y<int>)(new Y<int>(1));
Z2 z2 = (Y<int>)(new Y<int>(2));
y.a1 = z1.z1() + z2[2].p;
}
}
//------------------
public class A
{ public int a1; }
public interface Z0
{
void z0();
int p { set; get; }
Y<int> this[int i] { set; get; }
}
public interface Z1<T>
{ T z1(); }
public interface Z2 : Z0
{ void z2(); }
public abstract class X<T> : A, Z1<int>, Z2
{
public X(T i) { }
public T x1;
private int x2;
public void z0() { x2++; }
public int z1() { return x2; }
public void z2() { x2 += 3; }
public int p { set; get; }
public Y<int> this[int i]
{
set { x2 = value.a1; }
get { return new Y<int>(0); }
}
}
public class Y<T> : X<T>
{
public Y(T i)
: base(i)
{ this.i = i; }
private T i;
public void y1() { }
}
//------------------
}

amirjalili
یک شنبه 16 فروردین 1388, 11:51 صبح
با تشکر از شما دوست عزیز..
دوست گرامی من بیشتر به دنبال تفاوت کاربردی هستم..
در واقع سوال من اینه که در چه موقعیتی هر یک از این دو به هم ترجیح داده میشوند..

دقیقا کجا باید از اینترفیس استفاده کرد و کجا از abstract ؟ چه چیزی باعث ترجیح هر یک از این دو به هم میشود؟

ASKaffash
یک شنبه 16 فروردین 1388, 12:02 عصر
سلام
جواب شما در چهار خط اول است مثلا اگر در پروژه ای نیاز است از کلاسی استفاده شود که در آن قرار است یک Member مثل Property ایجاد کنید که دسترسی آن Private است از Interface شما نمیتونید استفاده کنید در یک کلام متناسب با پروژه شما هر یک از 4 محدودیت شما را به استفاده از یکی مقید میکند

amirjalili
یک شنبه 16 فروردین 1388, 12:46 عصر
با تشکر از شما..
راستش منظورم این بود که چه چیزی باعث ترجیح هر یک از اینها به هم میشه.. مثلا چرا در الگوی Composite استفاده از abstract رو به استفاده از interface ترجیح میدهند؟
دیاگرام های زیر شاید بهتر بتونن منظورم رو بیان کنند
شکل1:
http://ooad.wordpress.com/files/2008/03/comp1.jpg

شکل 2:( که استفاده از abstract را به interface ترجیح میدهد):
http://ooad.wordpress.com/files/2008/03/comp2.jpg

با تشکر