2011-06-30 47 views
7

tôi phải tạo ra một hệ thống quản lý khóa học với các hạng mục khóa học:Nhiều lớp trừu tượng có nguồn gốc?

Cooking, sewing and writing courses 

cookingwriting mỗi người đều có 2 khóa học (tiếng Ý, hải sản, ghi sáng tạo và kinh doanh ghi). Điều này tạo ra tóm tắt có nguồn gốc:

abstract course -> abstract cooking -> concrete seafood 

Nấu ăn và viết trừu tượng có các trường chung và một số phương pháp phổ biến, tuy nhiên chúng cũng có phương pháp trừu tượng trừu tượng trong lớp cơ sở.

Điều này có thể thực hiện được trong C# không? Nếu tôi tạo ra các phương thức trừu tượng lớp trừu tượng Visual Studio nói rằng chúng ẩn lớp cơ sở trừu tượng và sau đó các phương thức lớp bê tông có lỗi nói lớp cơ sở phải trừu tượng (đó là nhưng không được đăng ký). Tôi đã tìm một câu trả lời. Tôi biết thừa kế duy nhất được sử dụng trong C# nhưng thừa kế mang xuống chuỗi. Câu trả lời tốt nhất là gì?

Đây là một đoạn mã - Tôi hy vọng nó làm rõ các vấn đề:

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

Bạn có thể đăng mã mẫu với các sự cố bạn đang gặp phải không? –

Trả lời

0

Nếu tôi hiểu đúng tôi nghĩ rằng bạn muốn sử dụng từ khóa 'ảo' trên phương pháp trừu tượng bạn muốn ghi đè?

Nếu bạn đang nói về lỗi mà nói điều gì đó như "một số phương pháp giấu được thừa hưởng thành viên, thêm từ khóa mới nếu trốn được dự định", sau đó ảo trên phương pháp cơ bản và ghi đè vào phương pháp kế thừa sẽ làm:

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


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

Đây là đoạn mã - có lẽ nó sẽ làm rõ – Julesyw

7

nếu tôi làm cho các lớp trừu tượng có nguồn gốc phương pháp trừu tượng Visual Studio nói họ ẩn các lớp cơ sở trừu tượng và sau đó các phương thức lớp bê tông có lỗi nói rằng lớp cơ sở phải trừu tượng (đó là nhưng không được đăng ký)

Nếu bạn có lớp cơ sở 'A' có phương thức trừu tượng 'b()' thì bạn không phải khai báo 'b()' một lần nữa là tóm tắt trong B: A, để có C: B ghi đè lên nó, chỉ cần không sử dụng nó. Thậm chí nếu bạn ghi đè lên 'b()' phương thức trong lớp B bạn lại có thể ghi đè lên nó trong lớp 'c()' (và thậm chí sử dụng cơ sở(); để thực hiện triển khai B

Một số mã:.

.
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 
} 

Cũng cần làm rõ: phương thức trừu tượng được khai báo phải được ghi đè lên (giống như trong giao diện và chỉ bởi con trực tiếp của lớp khai báo phương thức trừu tượng).

+0

Hey - cảm ơn vì điều đó ... – Julesyw

+0

Chỉ cần làm rõ - bạn có thể thấy tôi có lớp bê tông A1 đến từ A cũng như A2 trừu tượng ngay cả khi nó trừu tượng trong A2 Nd tôi không muốn thực hiện nó - tôi phải ....Tôi không thể vượt qua phương pháp trừu tượng sau đó từ A2 đến B ... – Julesyw

4

Tôi nghĩ loại vấn đề này là tốt hơn để giải quyết bằng cách sử dụng giao diện chứ không phải lớp trừu tượng: Ví dụ:

// 
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

Tôi đã nghĩ đến việc sử dụng một giao diện - tuy nhiên trong hội đồng thảo luận một sinh viên đã đề cập đến họ và giảng viên nói không tìm kiếm việc thực hiện không có ... – 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) 
    { 

    } 
} 
Các vấn đề liên quan