2010-11-16 18 views
10

Soyut olarak işaretlenmiş bir temel sınıfım var. Bu temel sınıfta, yalnızca temel sınıfı miras alan diğer sınıflara görünür bir yöntem yapmak mümkün müdür?C# - Yöntemin yalnızca temel sınıfını miras alan sınıflar tarafından görülebilir bir yöntem nasıl yapılır

Temel sınıfım olan ve özet olarak işaretlenen Class1 var mı? Class2 Class1'i devralır ve tüm kamu yöntemlerine çağrı yapabilir. Class3'ün Class2 örneğini oluşturmasını, ancak Class1'in belirli yöntemlerine çağrı yapmasını istemiyorum. Bu yöntemleri soyut olarak işaretlemeye çalıştım ama sonra Class2 bunları kullanmaya çalıştığında bir hata alıyorum. hatadır: Neden yöntemi protected beyan değil

cevap

16
public abstract class Class1 
{ 
    protected abstract void Method1(); 
    public abstract void Method2(); 
} 

public class Class2 : Class1 
{ 
    protected override void Method1() 
    { 
     //Class3 cannot call this. 
    } 

    public override void Method2() 
    { 
     //class 3 can call this. 
    } 
} 

public class Class3 
{ 
    public void Method() 
    { 
     Class2 c2 = new Class2(); 
     c2.Method1(); //Won't work 
     c2.Method2(); //will work 
    } 
} 

"soyut olarak işaretlendiği için ... bir gövde beyan edemez"?

+0

Tam olarak aradığım şey. Korunmayı unuttum! Teşekkürler – PICyourBrain

5

protected anahtar sözcüğünü aradığınız gibi görünüyor. Bu, yalnızca belirtilen türde veya bu türden türeyen türler için kullanılmak üzere protected ile etiketlenen üyeyi sınırlar.

abstract class Class1 { 
    protected void Method1() { 
    ... 
    } 
} 

class Class2 : Class1 { 
    public void Method2() { 
    Method1(); // Legal 
    } 
} 

class Class3 { 
    public void Example() { 
    Class2 local = new Class2(); 
    local.Method2(); // Legal 
    local.Method1(); // Illegal since Method1 is protected 
    } 
} 
4

Sen protected olarak Class1 ve Class2 hem onları işaretlemek gerekir. Bu erişim değiştirici, bir üyeye türetilmiş sınıf (lar) erişimine izin verir, ancak türetilmiş sınıfların dışında hiçbir şey göremez.

1

protected anahtar sözcüğünü kullanın.

1

Bir protected abstract yöntem/özellik/alan istediğinizi düşünüyorum. Yine de, bunu uygulamak için override anahtar kelimesini Class2'de kullanmanız gerekecek. Bu, alana Class2 erişimi sağlar (eğer gerçekten bunu soyut olarak isterseniz), ancak bu alanlara class1 erişiminden miras almayan sınıflar vermez.

Cannot declare a body... iletisiyle ilgili size ulaşacak olan override.

İlgili konular