2011-06-30 16 views
7

Ben ders kategorilerine sahip bir Ders Yönetim Sistemi oluşturmak zorunda:Birden fazla türetilmiş soyut sınıflar?

Cooking, sewing and writing courses 

cooking ve writing her 2 kursları (İtalyan, deniz ürünleri, yaratıcı yazma ve iş yazma) var. Bu soyut türetilmiş oluşturur:

abstract course -> abstract cooking -> concrete seafood 

soyut pişirme ve yazma ortak alanlar ve bazı ortak yöntemleri var, ancak bunlar da temel sınıfta soyut soyut yöntemler var.

Bu C# ile yapılabilir mi? Visual Studio'nun soyut sınıf yöntemlerini türetiyorsam, temel sınıf özünü gizlediklerini söylerler ve daha sonra somut sınıf yöntemlerinin taban sınıfının soyut olması gerektiğini söyleyen hatalar vardır (ancak kayıt olmamalıdır). Bir cevap aradım. Biliyorum tek miras C# kullanılır ama miras zincirini taşır. En iyi cevap nedir? İşte

bir kod parçacığı - ı sorunu düzeltmeye yardımcı olmuştur: Sana geçersiz kılmak istediğiniz soyut yöntemler üzerinde 'sanal' anahtar kelimesini kullanmak isteyeceğinizi düşünüyorum doğru anlamak

public abstract class Course 
{ 
    public abstract void AddStudent(StudentName sn, int f); 
    public abstract decimal CalculateIncome(); 
} 

public abstract class WritingCourse : Course 
{ 
    public void AddStudent(StudentName sn, int f) 
    { 
    //Add student 
    } 
    public abstract decimal CalculateIncome(); // can only be claculated in concrete 
} 

public class BusinessWritCourse : WritingCourse 
{ 
    public void AddStudent(StudentName sn, int f): 
    base(sn, false){} 

    public decimal CalculateIncome() 
    { 
     return //do stuff 
    } 
} 

public class SewingCourse : Course 
{ 
    public override void AddStudent(StudentName sn, int f) 
    { 
     //do stuff 
    } 

    public override decimal CalculateIncome() 
    { 
     return //do stuff 
    } 
} 
+1

Eğer karşılaştığınız sorunları olan örnek kod gönderebilir miyim? –

cevap

0

?

:

Eğer baz yönteminde "bazı yöntem gizleme amaçlı olduğunu eğer yeni bir anahtar kelime eklemek, üyesi miras gizler" gibi bir şey, o zaman sanal diyor ve yapacak devralan yöntemine geçersiz hata bahsedecek olursak Ben türetilmiş soyut sınıf yaparsanız

public abstract class BaseClass 
{ 
    public virtual void SomeMethod() 
    { 
    } 
} 


public abstract class InheritingClass : BaseClass 
{ 
    public override void SomeMethod() 
    { 
    } 
} 
+0

İşte bir kod parçacığı - belki de – Julesyw

7

soyut Visual Studio diyor yöntemler daha sonra beton sınıfı yöntemleri temel sınıf soyut olmalıdır söyleyerek hataları var taban soyut sınıf ve gizlemek (o ama olmamalıdır kayıt)

Eğer 'b()' soyut bir yöntemi olan 'A' temel sınıfınız varsa, B: (B) 'de özet olarak' b() 'ifadesini tekrar etmek zorunda değilsiniz. Bunu geçersiz kıl, sadece kullanma. Eğer ') (b' sınıf B yöntemi geçersiz olsa bile yine ') (c' sınıfta geçersiz (ve hatta tabanını kullanabilirsiniz(); B'nin uygulanmasını gerçekleştirecek

Bazı kod:.

.
public abstract class A{ 
    public abstract void b(); 
} 

public class B : A{ 
    public override void b() { //do stuff }; //overrides b from a 
    public virtual void c() { //do stuff }; //creates an implemented method c in B that can be overriden by childs. 
    public void d() { //do stuff}; 
} 

public class C : B{ 
    public override void b() { //do stuff}; //overrides b from A, works! 
    public override void c() {//do stuff}; //overrides c from B, works! 
    public override void d() {//do stuff}; //doesn't work since d from B isn't abstract or virtual (hides it) 
    public new void d() {//do stuff}; //works, hides d, but when you use inheritance this method will not be called, instead B's d() method will be called, only if you see C as the specific class C this will work 
} 

Ayrıca açıklığa kavuşturmak için: soyut beyan edilen yöntemlerin geçersiz kılınması gerekir (tıpkı bir arayüzde olduğu gibi, ve sadece soyut yöntemin beyan edildiği sınıfın doğrudan çocuğu tarafından) Sanallaştırılan yöntemler geçersiz kılınabilir;

+0

Hey açıklığa kavuşacak - teşekkürler ... – Julesyw

+0

Sadece açıklığa kavuşturmak için - gördüğünüz gibi, A'dan gelen bir somut A sınıfı var. A2 Nd'de uygulamak istemiyorum - Ben ....Soyut metodu A2'den B'ye geçiremiyorum ... – Julesyw

4

Bu tür sorunların, arayüzleri kullanarak değil, soyut sınıfları kullanarak çözmek için daha iyi olduğunu düşünüyorum: Ör:

// 
interface IInterface1 
{ 
    void SameMethod(); 
} 

interface IInterface2 
{ 
    void SameMethod(); 
} 


class TestClass : IInterface1, IInterface2 
{ 
    void IInterface1.SameMethod() 
    { 
     // do one thing for Interface 1 
    } 

    void IInterface2.SameMethod() 
    { 
     // do something elsefor Interface 2 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     TestClass test = new TestClass(); 

     IInterface1 i1 = test; 
     i1.SameMethod(); // will call IInterface1.SameMethod() 

     IInterface2 i2 = test; 
     i2.SameMethod(); // will call IInterface2.SameMethod() 

    } 
} 
+0

Bir arayüz kullanmayı düşündüm - ancak tartışma panosunda bir öğrenci bunlardan bahsetti ve öğretim üyesi orada olmayan uygulamayı aramamayı söyledi ... – Julesyw

1
public class StudentName 
{ } 

public abstract class Course 
{ 
    public abstract void AddStudent(StudentName sn, int f); 
    public abstract decimal CalculateIncome(); 
} 

public abstract class WritingCourse : Course 
{ 
    override public void AddStudent(StudentName sn, int f) 
    { 
     //Add student 
    } 
    override public abstract decimal CalculateIncome(); // can only be claculated in concrete 
} 

public class BusinessWritCourse : WritingCourse 
{ 
    override public void AddStudent(StudentName sn, int f) 
    { base.AddStudent(sn, 0); } 

    override public decimal CalculateIncome() 
    { 
     return (decimal)3.4;//do stuff 
    } 
} 

public class SewingCourse : Course 
{ 
    public override void AddStudent(StudentName sn, int f) 
    { 
     //do stuff 
    } 

    public override decimal CalculateIncome() 
    { 
     return (decimal)10; //do stuff 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 

    } 
}