جعل الأساليب/الخصائص مرئية لفصل واحد، ومخفية للآخرين

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

  •  23-08-2019
  •  | 
  •  

سؤال

عندي حصة دراسية Server الذي يتحدث إلى اتصال الخادم لـ IRC.وهو يحمل قائمة معروفة Users، وينشئها حسب الضرورة.

لدي مشكلتين تتعلقان بـ User فصل:

  1. يمكن لأي شخص إنشاء مثيل لـ User.أريد فقط Server الطبقة لتكون قادرة على القيام بذلك.
  2. إذا كان المستخدم (الشيء User يصف) يغير اسمه (أو معلومات أخرى، مثل القنوات المنضمة)، Server يمكن للطبقة تغييرها بنفسها.ومع ذلك، يمكن للفئات الأخرى أيضا!أريد منع الفئات الأخرى من لمس هذه المعلومات (مما يجعلها للقراءة فقط لهم).

كيف يمكنني حل هاتين المشكلتين؟في C++، يمكن حلها باستخدام friend الكلمة الأساسية وجعل ctor و setName (و كذا) الخاص.

هل هناك كلمة أساسية في C# يمكن أن تسمح بإمكانية الوصول إلى طريقة معينة بواسطة فئة محددة؟وهذا من شأنه أن يحل مشكلتي.

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

المحلول

بصراحة أجد friend الوصول الذي نشأ من C ++ لتكون أعراض التصميم السيئ. أنت أفضل حالا في إصلاح التصميم الخاص بك.

لبدء، من يهتم حقا إذا قام شخص ما بإنشاء مستخدم؟ هل هو مهم حقا؟ أسأل هذا لأنه يبدو أنه في بعض الأحيان ننشغل المبرمون في بعض الأحيان القلق بشأن الأشياء التي ببساطة لن تحدثها ببساطة أو، إذا فعلت ذلك، فلا يهم.

إذا كنت حقا تهتم، ففعل أحد الإجراءات التالية:

  • جعل المستخدم واجهة. يمكن للخادم إنشاء فئة خاصة تنفذها؛ أو
  • اجعل المستخدم فئة داخلية من الخادم مع عدم وجود منشئين عموميين حتى يمكن لخادم فقط إنشاءه.

الخارقة الرؤية (أي أصدقاء في C ++ هي واحدة وحزمة الوصول في جافا كلاهما أمثلة جيدة) ببساطة مطالبة بالمتاعب وليس فكرة جيدة.

نصائح أخرى

الأقرب في عالم .NET إلى friend هل internal الرؤية.

لاحظ أنه إذا كان الفصلان الخاصان بك في تجميعات منفصلة، ​​فيمكنك استخدام الملف الداخليةVisibleTo السمة للسماح برؤية مجموعة واحدة للأجزاء الداخلية للأخرى.

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

ربما سأفعل شيئا مثل هذا:

// An abstract base class. This is what I'd use outside the 
// Server class. It's abstract, so it can't be instantiated
// on its own, and it only has getters for the properties. 
public abstract class User
{
   protected User()
   {
   }

   public string Name { get;}
   // Other get-only properties
}

public class ServerUser : User
{
   public ServerUser()
   {
   }

   public string Name { get; set;}
   // Other properties. 
}

ثم قم بإنشاء فئات Server Server Server Serveruser، مستخدم فئة الخادم لتغيير الخصائص على فئات ServerUser (مثل تغيير اسم المستخدم) ولكن فقط تعرض فئات المستخدمين على العالم الخارجي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top