2010-08-08 18 views
7

C# 'da bunu nasıl yapacağımı öğrenmek için beynimi kırarım. Aslında bir MxN metin ızgarası olan bir TextGrid sınıfım var. Bir TextGrid'de (X, Y) konumunu koruyan bir Cursor sınıfının yanı sıra pozisyonu hareket ettirmek, mevcut pozisyonu sorgulamak için yöntemler vb. Kullanmak isterdim. İdeal olarak, bu sınıfın bir TextGrid'e mantıksal olarak eklenmeden işe yaramaz olduğu için TextGrid dışında oluşturulabilir.Bir sınıfın yalnızca başka bir sınıfta oluşturulmasını nasıl kısıtlayabilirim?

Ancak, bununla başa çıkmak için yaklaşımları eşit değildir: 1) İmleç, özel bir yapıcı ile birlikte TextGrid içine yerleştirilmiş bir ortak sınıf olmalıdır, 2) İmleç, TextGrid ile iç içe özel bir sınıf olabilir. public constructor ve 3) İmleç, kamu kurucusu olan TextGrid dışında kendi ayrı bir genel sınıf olabilir. # 1 çalışmıyor çünkü özel kurucu nedeniyle bir imleci TextGrid içinden başlatamıyorum. # 2 çalışmıyor çünkü erişim kısıtlamaları nedeniyle oluşturulan İmleç nesnesini TextGrid (ör. Bir GetCursor() yöntemi) dışında döndüremiyorum. Ve # 3 hiç yardım etmiyor.

Hemen hemen, ne yapmak istiyorum C# Java'nın Yineleyiciyi eşdeğer olduğunu. Mümkün mü?

cevap

7

kullanın 2. fakat arayüzü tarafından iade: Sorun iyi bir yaklaşımdır çözmek için bir arayüz kullanırken sadece bir örneği ile ilişkili Cursor sınıfın her örneğini yapmak istiyorsanız,

public interface ICursor 
{ 

} 

public class TextGrid 
{ 
    private class Cursor : ICursor 
    { 
    } 

    // This could be a property if it doesn't require much calculation. 
    public ICursor GetCursor() 
    { 
    } 
} 
+0

Bu güzel çalıştı, ben haha, bazı sınıf tel çekmeyi yapmak zorunda olsa. Teşekkürler! –

1

TextGrid sınıfın, sadece gibi kurucusuna tip TextGrid bir argüman iletilmesi yaratıcısı gerektirebilir:

public class Cursor 
{ 
    public Cursor(TextGrid owner) 
    { 
     ... 
    } 
} 
İlgili konular