我有一个我不明白的编译问题。我会对代码进行一般化,以使其更容易理解,我希望我不会失去意义。错误是:
MyInterface1 does not contain definition for 'MyClass1'
这是正确的,因为MyClass1
位于MyInterface2
。
如果我像这样切换接口的顺序:
public partial class MyPresenter : ParentPresenter<MyInterface2>, ParentPresenter<MyInterface1>
然后编译。这是怎么回事?
第一档:
namespace MyNameSpace
{
public partial class MyPresenter : ParentPresenter<MyInterface1>, ParentPresenter<MyInterface2>
{
public MyClass1 MyClass1 { get; set; }
public void MyMethod() {
View.MyClass1 = this.MyClass1; // compile error on View.MyClass1
}
}
}
第二档:
namespace MyNameSpace
{
public interface MyInterface1
{
System.Collections.IList MyList1 { set; }
}
public interface MyInterface2
{
MyClass1 MyClass1 { set; }
System.Collections.IList MyList2 { set; }
}
}
file3的:
public abstract class ParentPresenter<TView> : System.IDisposable
{
private TView _view;
private Microsoft.Practices.CompositeUI.WorkItem _workItem;
public TView View
{
get { return this._view; }
set
{
this._view = value;
this.OnViewSet();
}
}
}
编辑:将setter添加到MyClass1
答案 0 :(得分:3)
编辑后问题很明显。
你在做:
public partial class MyPresenter : ParentPresenter<MyInterface1>
这意味着你的类继承自:
public abstract class ParentPresenter<TView> : System.IDisposable
TView
是MyInterface1
。
因此,您的View
属性现在属于MyInterface1
类型,它没有MyClass1
的定义,因此您尝试访问{{1}的编译器错误}}
此:
View.MyClass1
C#不支持多重继承。它只允许接口,但不允许类(在原始问题中,您实现了两个接口,这是受支持的:在编辑之后,您尝试从两个类继承,而不是)。
但你可以这样做:
public partial class MyPresenter :
ParentPresenter<MyInterface1>,
ParentPresenter<MyInterface2>
然后你可以这样做:
public interface MyInterface3 : MyInterface1, MyInterface2
{
}
这意味着您的public partial class MyPresenter : ParentPresenter<MyInterface3>
必须实现两个接口(View
和MyInterface1
),并声明为实施MyInterface2
(C#不支持鸭子打字,但从它的外观,它已经实现了所有必要的