2016-03-29 13 views
2

Aşağıdaki sahte C# kodu verilerek çağırır uyarı oluşturmak: (Work() yöntemini geçersiz kılar) türetilmiş bir sınıf Work() yöntemi çağrıları, bu şekilde dizaynı ileönlemek/alt overriden elemanı

public abstract class Worker 
{ 
    public void DoWork() 
    { 
     Prepare(); 
     Work(); 
     Cleanup(); 
    } 

    protected abstract void Work(); 
} 

, bu mümkün direkt olarak.

Bu çağrı için herhangi bir alt sınıfın nasıl önleneceğine veya en azından bir derleyici uyarısı oluşturmaya yönelik tasarım ipuçları arıyorum.

Bunu neden yapmak istiyorum? İşçi aslında Work()'u başka bir iş parçacığına gönderir. DoWork() kilitleme ile ilgilenir.


Biliyorum, bu garip. Work() -body, sadece DoMyWork()'a bir yöntem çağrısından oluşabilir ve nesne başka bir yerde DoMyWork()'u arayabilir. Bunu engellemek imkansız.

Neyse. Bu konuda herhangi bir fikre değer veriyorum.

+0

Yardımcı olur mu? [bunu kontrol edin] (http://stackoverflow.com/questions/5274639/preventing-override-of-individual-methods-in-c-sharp) –

+0

Biliyorsunuz ki (kullanım durumunuzu bir kenara bırakınız) kandırmak için şizofren gibi geliyor Kendisine uyguladığı bir yöntemi çalıştırmak için bir nesne (soyut bir sınıf durumunda bu tür bir yöntemi geçersiz kılmaz, ancak bir yöntemi uygular). Kullanım vakası hakkında biraz zaman düşünürüm ama bu şekilde başarmanın hiçbir yolu olmadığından eminim. – dryman

+1

Bunun yerine bir iş oluşturmayı düşündünüz mü? – Eris

cevap

1

Teşekkür Eriş ve Corey sanırım anladım. Bu yolla ilgili olarak:

public abstract class Worker 
{ 
    public void DoWork() 
    { 
     if (Work != null) 
     { 
      Prepare(); 
      Work(); 
      Cleanup(); 
     } 
    } 

    protected Action Work { private get; set; } 
} 

public class ImplWorker { 
    public ImplWorker() { 
     Work = //whatever 
    } 
} 

Yine de gerçekten istediyse, başka bir yerde ve başka bir yerde saklayabilir. Ama hayal edebileceğim kadar uzağa gider.

+1

Bu, daha önce İşçi'den devralınan herhangi bir sınıfı bozardı. Eğer bunu yapacaksan, o zaman devam edebilirsin ve yöntemi tamamen kaldırabilirsin. – returnsvoid

+0

Mümkün olan bir şeyi yasaklamadan önce, her zaman değişikliklere son verecek veya amacını yanlış anlayabileceğim mi? – dryman

+0

Sanırım bu, "yanlış şekilde kullanılmasını önlemek için yeterli çaba gösterildiğini" düşündüğüm şey. Teşekkürler! – thomai

0

Çalışması (örn uzak sunucu, veritabanı bağlantı) bir kaynak kullanılarak yapılır, ya da böyle olmak değiştirilebilir, o zaman böyle yapabileceğini:

public interface IResource 
{ 
} 

public abstract class Worker 
{ 
    private class TheResource : IResource 
    { 
     // implement 
    } 

    public void DoWork() 
    { 
     Prepare(); 

     var resObj = new TheResource(); 
     Work(resObj); 
     // if needed, cleanup/dispose resObj here 

     Cleanup(); 
    } 

    protected abstract void Work(IResource resourceObj); 
} 
0

Bu bir korsanlıktır, ancak sanal olarak yöntemi değiştirebilir, yeni yöntemi çağıran bir gövde ekleyebilir ve daha sonra buna ObsoleteAttribute ekleyebilirdiniz. daha önce Çalışma geçersiz kılmak için gereksinim duymayan, kırma bulunan mevcut alt sınıfları önleyecektir sanal olarak yöntemini İşaretleme

protected void DoWork() 
    { 
     // New method 
    } 

    [Obsolete("This method is deprecated.")] 
    protected virtual void Work() 
    { 
     DoWork(); 
    } 

().