我有两个界面:IBaseClass
和IContainer
。
IBaseClass
的公共属性为IContainer
。
我还有以下两个继承自IBaseClass
的类:
1)FirstClass : IBaseClass
2)SecondClass: IBaseClass
以下两个类继承自IContainer
:
1)FirstContainer : IContainer
2)SecondContainer: IContainer
我需要从外部访问这两个容器,这就是我在IContainer
中放置IBaseClass
的属性的原因。我确实理解我必须执行转换才能访问FirstContainer
和SecondContainer
不常见的字段。
但是,我只会在FirstContainer
内使用FirstClass
,SecondContainer
时只使用SecondClass
。IBaseClass
由于FirstClass
定义了该属性,当我在FirstContainer
内并且想要访问IContainer
中不存在的FirstContainer
属性时,我有执行转换为IBaseClass
。
假设public IContainer ClassContainer { get; set; }
具有以下属性:
FirstContainer
除了在FirstClass
private TheContainer = ClassContainer as FirstContainer;
内创建TheContainer
的私人成员之外,还有其他办法吗?
FirstClass
然后在FirstContainer
内使用public abstract class IShapeBase<T> : Shape
{
public T ShapeContainer { get; set; }
}
代替public abstract class IShapeContainer
{
public Point Location { get; set; }
}
?
更新
以下是我创建的课程:
IShapeBase:
public class NewRectangle: IShapeContainer
{
public Point BottomRight { get; set; }
}
IShapeContainer:
ViewModel
NewRectangle:
private IShapeBase<IShapeContainer> m_currentDrawingObject;
private void Draw()
{
m_currentDrawingObject = new NewRectangle();
}
现在,在我的Cannot implicitly convert type 'NewRectangle' to 'IShapeBase<IShapeContainer>'
中,我有以下内容:
m_currentDrawingObject
这一行没有编译:{{1}}
它让我可以将IShapeBase<IShapeContainer>
从NewRectangle
更改为abstract class
,但是使用const store = {}
const Document = Parse.Object.extend('Document')
store.find = () => {
const query = new Parse.Query(Document)
return query.find()
}
store.fetch = () => {
return store.find().then((results) => {
_.map(results, (result) => {
return result.toJSON()
})
})
}
毫无意义。
问题是什么?
答案 0 :(得分:1)
您可以保留IContainer
,但可以创建两个子接口,例如
interface IFristContainer : IContainer
interface ISecondContainer : IContainer
这些代表了First和Second类型的更精细的界面。
然后在您的IBaseClass
中,您需要使容器属性成为受约束的泛型类型
public interface IBaseClass<T> where T: IContainer
{
T Container {get; set;}
}
当您实施IBaseClass<T>
时,它将是
public class FirstClass: IBaseClass<IFirstClass> {...}
public class SecondClass: IBaseClass<ISecondClass> {...}
答案 1 :(得分:0)
也许更好的方法是:
private FirstContainer _container
public IContainer ClassContainer {
get { return _container;}
set { _container = value as FirstContainer;}
}
您无需返回&#34; _container作为IContainer&#34;因为FirstContainer实现了IContainer。
UPD:以这种方式设置需要进行投射。现在你不允许使用另一个实现IContainer的类。