在 c# 中使用继承时防止强制转换
本文关键字:转换 继承 | 更新日期: 2023-09-27 18:31:10
我有两个接口:IBaseClass
和IContainer
。
IBaseClass
具有类型 IContainer
的公共属性。
我还有以下两个从IBaseClass
继承的类:
1) FirstClass : IBaseClass
2) SecondClass: IBaseClass
以下两个类继承自IContainer
:
1) FirstContainer : IContainer
2) SecondContainer: IContainer
我需要从外部访问这两个容器,这就是为什么我在IBaseClass
中放置了IContainer
属性的原因。我确实了解我必须执行转换才能访问FirstContainer
和SecondContainer
都不通用的字段。
但是,我只在FirstClass
内使用FirstContainer
,只有在SecondClass
内时才使用SecondContainer
。
由于IBaseClass
正在定义属性,因此当我在FirstClass
内部并想要访问IContainer
中不存在的FirstContainer
的属性时,我必须执行强制转换才能FirstContainer
。
假设IBaseClass
具有以下属性:
public IContainer ClassContainer { get; set; }
除了在FirstClass
内部创建一个FirstContainer
的私人成员之外,有没有办法解决它,如下所示:
private TheContainer = ClassContainer as FirstContainer;
然后在FirstClass
里面使用TheContainer
而不是FirstContainer
?
更新
以下是我创建的类:
IShapeBase:
public abstract class IShapeBase<T> : Shape
{
public T ShapeContainer { get; set; }
}
容器:
public abstract class IShapeContainer
{
public Point Location { get; set; }
}
新矩形:
public class NewRectangle: IShapeContainer
{
public Point BottomRight { get; set; }
}
现在,在我的ViewModel
中,我有以下内容:
private IShapeBase<IShapeContainer> m_currentDrawingObject;
private void Draw()
{
m_currentDrawingObject = new NewRectangle();
}
此行不编译:Cannot implicitly convert type 'NewRectangle' to 'IShapeBase<IShapeContainer>'
它让我可以将m_currentDrawingObject
从IShapeBase<IShapeContainer>
更改为NewRectangle
,但是使用abstract class
就没有意义了。
问题可能是什么?
.net fiddle
您可以保留IContainer
,但是创建两个子接口,例如
interface IFristContainer : IContainer
interface ISecondContainer : IContainer
这些表示第一和第二类型的更精细的接口。
然后在IBaseClass
中,您需要使容器属性成为受约束的泛型类型
public interface IBaseClass<T> where T: IContainer
{
T Container {get; set;}
}
当您实现IBaseClass<T>
时,它将是
public class FirstClass: IBaseClass<IFirstClass> {...}
public class SecondClass: IBaseClass<ISecondClass> {...}
也许更好的方法是:
private FirstContainer _container
public IContainer ClassContainer {
get { return _container;}
set { _container = value as FirstContainer;}
}
您不需要返回"_container作为IContainer",因为FirstContainer实现了IContainer。
UPD:以这种方式在布景中需要演员。现在,您不能使用实现 IContainer 的另一个类。