在c#

时间:2016-01-19 15:52:47

标签: c# inheritance properties casting

我有两个界面:IBaseClassIContainer

IBaseClass的公共属性为IContainer

我还有以下两个继承自IBaseClass的类:

1)FirstClass : IBaseClass

2)SecondClass: IBaseClass

以下两个类继承自IContainer

1)FirstContainer : IContainer

2)SecondContainer: IContainer

我需要从外部访问这两个容器,这就是我在IContainer中放置IBaseClass的属性的原因。我确实理解我必须执行转换才能访问FirstContainerSecondContainer不常见的字段。

但是,我只会在FirstContainer内使用FirstClassSecondContainer时只使用SecondClassIBaseClass

由于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() }) }) } 毫无意义。

问题是什么?

2 个答案:

答案 0 :(得分:1)

.net fiddle

您可以保留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的类。