كيفية حل "يجب أن يكون MarshalByRefObject" في وضع جيد ولكن متعددة الميراث بتر لغة مثل C# ؟

StackOverflow https://stackoverflow.com/questions/313243

سؤال

كيفية حل "يجب أن يكون MarshalByRefObject" في وضع جيد ولكن متعددة الميراث بتر لغة مثل C# ؟

المشكلة بسيطة جدا في العديد من الحالات عليك أن ترث من هذه الفئة (متطلبات البنية التحتية).لا يهم حقا هنا ، والتي الحالات.لذا ماذا تفعل إذا كنت قد ورثت من بعض فئة أخرى (المجال الخاص بك نموذج المتطلبات)?

راجع للشغل التطبيق الجيد أطر مثل spring.net دائما تأكد من أنك لا يجب أن ترث من هذه الفئة بغض النظر عن أي نوع من البنية التحتية تحتاج إلى تقديم طلب إلى صفك.

أود أن أعرف ما أنا الحصول -3 الأصوات هنا عن ؟ ؟ :)

هل كانت مفيدة؟

المحلول

بشكل عام كنت تريد فقط لجعل كائن MarshalByRef إذا كنت تنوي استخدامه في الاتصال عن بعد / WCF السياق.هذا هو عادة خاصة-بما فيه الكفاية حال ليس الألم.

افترض أن لديك النوع العام ، أردت أن تستمد من التخصص ، ثم بعد نوع مشتق - الآن لديك مشكلة ، لأن تكون إبعاد كائن يجب أن ترث من MarshalByRefObject ، الأصلي العامة نوع لم.افترض أنك لا يمكن تغييره لأنك تفعل الثنائية الميراث, أو لأنه في حد ذاته مستمد من قاعدة الطبقة لا تستطيع تغييرها ؟ كما ذكره السائل ، منذ C# (و .صافي في العام) لا تسمح MI, لا يمكنك أن ترث من كل.

الجواب القصير هو أن كنت نوع من ثمل.إما لتغيير العامة نوع inhert من MarshalByRefObject (أو تذهب بعيدا بما فيه الكفاية في سلسلة التي يمكن إدراجها في مكان فعالة) ، أو آخر يمكنك التفكير في اللعب مع الكائنات الوكيل.

هل يمكن على سبيل المثال إنشاء واجهة العقد الذي يصف نوع واجهة ، ومن ثم بناء وكيل نوع وراثة من MarshalByRefObject أيضا أن تنفذ واجهة طريق تكوين وفد إلى مثيل من نوع (أي المجمع).ثم هل يمكن النائية مثيل من نوع الوكيل الذي سوف مثيل و لا يعمل كما هو متوقع - لكن كل عودة أنواع من الأساليب يجب أن تكون [Serializable].

public interface IMyType
{
    string SayHello();
    string BaseTypeMethodIWantToUse();
}

public class MyType : MyBaseType, IMyType
{
    public string SayHello()
    {
        return "Hello!";
    }
}

public class MyRemoteableType : MarshalByRefObject, IMyType
{
    private MyType _instance = new MyType();

    public string SayHello()
    {
        return _instance.SayHello();
    }

    public string BaseTypeMethodIWantToUse()
    {
        return _instance.BaseTypeMethodIWantToUse();
    }
}

يبدو مثل الكثير من العمل ، على الرغم من.في نهاية المطاف إذا كنت في هذا السيناريو أقترح إعادة تصميم أو إعادة النظر.

نصائح أخرى

ذلك يعتمد على كيفية كنت بحاجة إلى الحصول على ذلك.باستخدام قاعدة فئة مشتقة من MarshalByRefObject قد تفعل ذلك.التجميع قد تفعل ذلك.دون مزيد من الأمثلة الملموسة على ما تحتاجه من الصعب القول, لكنه حالة نادرة أن وراثة متعددة سيكون الحل الوحيد للمشكلة.

لا يمكنك أن ترث من فئات متعددة.لذلك تحتاج إما إلى (أ) تغيير إعدادات الميراث الهرمي قاعدة يرث من ذلك ، أو (ب) كتابة طلبك بشكل مختلف.

دون مزيد من المعلومات حول لماذا تحتاج إلى ترث من MarshalByRefObject أو لماذا قاعدة الخاص بك فئة لا (لا؟) ثم إنه من الصعب إعطاء أي نصائح ملموسة.

ولكن أقول إذا كان لديك نوع مشتق يحتاج منظمة مختلفة دلالات إلى قاعدتها ، ثم ربما كنت قد حصلت على معمارية المسألة في مكان ما.

"لذا ماذا تفعل إذا كنت قد ورثت من بعض فئة أخرى (المجال الخاص بك نموذج المتطلبات)?"

يمكنك إنشاء قاعدة فئة قطعة من المجال الخاص بك النموذج الذي يتطلب الميراث من MarshalByRefObject?

لقد كان النجاح مع نهج عام.T لا يجب أن تكون "MarshalByRefObject".بالطبع سيكون لديك لاستبدال "RemoteProcess" مع كائن يمكنك استخدام الاتصال عن بعد.ثم يمكنك الوصول إلى الخاص بك غير MarshalByRefObject كما RemotingHost.RemoteObject.

public class RemotingHost<T> : MarshalByRefObject where T: class
{
    RemoteProcess host;
    T remoteObject;
    public T RemoteObject { get { return remoteObject; } }

    public RemotingAdmin()
    {
        host = new RemoteProcess();
        remoteObject = (T)host.CreateObject(typeof(T));
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top