2014-04-27 42 views
0

尽管未显示每个部分类都具有Courses事件的实现。不能隐式转换类型抽象类

public abstract class Subject<T> where T : Course 
{ 

ICollection<T> Courses { get; set; } 
} 
public partial class Student_Subject :Subject<Student_Course > 
{} 
public partial class Tutor_Subject :Subject <Tutor_Course> 
{} 
public abstract class Course {} 

public partial class Student_Course Course {} 

public partial class Tutor_Course : Course {} 

我得到一个错误。

 Subject<Course> subject; 
    if(type ==1) 
    { 
     subject = new Student_Subject(); // error 

为什么我不能转换这种类型。 Student_Subject是一个主题。我是C#的新手,我花了整整一天的时间来处理这个问题。我最初尝试使用接口,但为了实现这个功能,我必须使它成为只允许读访问的共变体。 (如果我没有记错的话)。我错过了什么,有没有更好的方法来实现这个愿望功能

+0

Student_Subject的声明显示它实现了ISubject ,而您期待的 将被转换为ISubject 。这两个实现是不同的。 – Riz

回答

1

课程和Student_Course之间的差异可能不能被隐式转换。你可以做的是使用动态:

dynamic subject; 

if (id == 1) 
    subject = new Student_Subject(); 

或者你可以使用某些设计模式;例如,使用包装类各地的各类学生类或具有自定义界面,您可以检查一个实例通过实现:

object course; 

//init logic 

if (subject is IStudentSubject) 
{ 
    // Convert and do something with 
} 

有它周围是便捷的方式。

+0

你会说这是不好的做法吗? –

+1

不一定。有时候,有意义的是,你试图在一系列不同类型的对象上达到某种程度的通用性。有点像复合模式... –