在 c# 中使用继承时防止强制转换

本文关键字:转换 继承 | 更新日期: 2023-09-27 18:31:10

我有两个接口:IBaseClassIContainer

IBaseClass具有类型 IContainer 的公共属性。

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

1) FirstClass : IBaseClass

2) SecondClass: IBaseClass

以下两个类继承自IContainer

1) FirstContainer : IContainer

2) SecondContainer: IContainer

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

但是,我只在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_currentDrawingObjectIShapeBase<IShapeContainer>更改为NewRectangle,但是使用abstract class就没有意义了。

问题可能是什么?

在 c# 中使用继承时防止强制转换

.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 的另一个类。