繁体   English   中英

访问从基础 class 继承的 class 属性

[英]access inherited class properties from base class

我有基础 class 和两个继承类,这两个继承类也共享这两个属性。 我想从基础 class 访问这些属性。 怎么做? 下面的例子。

public abstract class ClientEngine
{
        public void SaveFile(string fileName);
        {
            //Not implemented, I get error here because I don't know how to access Inherited class properties
            if (FileStorage != null))
                File.WriteAllBytes(fileName, FileStorage);
        }
}

    public interface IEngineEntity
    {
        byte[] FileStorage { get; set; }
    }

public class MyEntity1 : ClientEngine, IEngineEntity
{

public string MyProperty1 {get; set;}
public string MyProperty2 {get; set;}

public byte[] FileStorage { get; set; }
}

public class MyEntity2 : ClientEngine, IEngineEntity
{

public string MyProperty3 {get; set;}
public string MyProperty4 {get; set;}

public byte[] FileStorage { get; set; }
}

如果您需要从基础 class 访问属性,那么您做错了。 在您未来的设计中记住这一点。

您应该在基础 class 中声明FileStorage ,因为两个继承的类都有它。

如果您不想定义FileStorage的特定类型(例如byte[] ),您可能希望将其定义为更通用的类型,例如IEnumerable<byte> 或者,您可以将FileStorage声明为一个接口,该接口提供您需要从基本 class 访问的任何行为。

更新

@ghimireniraj 的一个很好的观察:您还应该尝试从 IEngineEntity 派生 ClientEngine。 OO 设计的底线之一是,如果您在所有继承的类中复制行为,它应该在基础 class 中。

但是,您真的想从基础 class 访问一些代码吗? 你不应该。 但如果你真的需要,你总是可以投:

public abstract class ClientEngine
{
    public void SaveFile(string fileName);
    {
        byte[] fileStorage = null;
        if (this is MyEntity1)
        {
            MyEntity1 me1 = (MyEntity1)this;
            fileStorage = me1.FileStorage;
        }
        else if (this is MyEntity2)
        {
            MyEntity2 me2 = (MyEntity2)this;
            fileStorage = me2.FileStorage;
        }
        if (fileStorage != null))
            File.WriteAllBytes(fileName, fileStorage);
    }
}

恶心吧? 但它应该看起来很脏,因为我们试图打破 OO 设计。

更新

另一种方法是按照 Marc Gravell 的建议进行。 与其转换为类型,不如转换为接口。 但是这一切对我来说仍然很糟糕:我坚信你可以改进你的设计。

这样做的方法是使其成为基础 class 中的抽象成员,并在派生中覆盖; 您可以使用的另一种方法是尝试将this转换为IEngineEntity - 如果成功,请通过接口使用它,即

var engine = this as IEngineEntity;
if(engine == null) throw new InvalidOperationException(
   "All engine implementations must provide an IEngineEntity implementation");
var bytes = engine.FileStorage;

但是,如果它是所有子类的强制要求,那么不将其推向基类似乎有点不寻常 通过将其推送到基类,您不会忘记实现缺少的成员。

另一种功能替代方案:

var derivedType = Type.GetType(this.GetType().FullName);
var FileStorage = derivedType.GetProperty("FileStorage", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic).GetValue(this) as byte[];
if (FileStorage != null) 
{
    ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM