在将类声明为抽象时,创建“抽象”类成员的最佳方法是什么?

时间:2014-02-20 15:10:08

标签: c# .net winforms inheritance activereports

我想创建一个类作为抽象,但我不能,因为该类的基类是ActiveReports,一旦我将其抽象化,子报告就不再可设计了。 (有趣的是,基类本身是可设计的,但不是它的孩子)。

我知道如果没有先将类声明为抽象类,我就不能将类成员声明为抽象。

在这种情况下,NEXT BEST的方法是什么。此时,我将成员设为虚拟成员并为每个成员添加了评论。在有意义的地方我也宣布成员是受保护的而不是公开的。但还有其他一些最好的方法可以要求在编译时覆盖这些成员而不是运行时吗?

如果你处于这种情况,你会怎么做?

编辑

让我进一步解释。我可以创建一个继承自ActiveReports的类(让我们称之为MyReportsBase)。 (我使用add new并选择ActiveReports类型)然后,ActiveReports在MyReportsBase(在设计时属性中)提供名为MasterClass的报表对象的属性。一旦我将该属性设置为true,我就可以创建新报告并从MyReportsBase继承,而不是直接从ActiveReports继承。 (你这样做的方法是通过create添加新的ActiveReports,然后编辑代码隐藏中的代码以继承MyReportsBase而不是ActiveReports。)

这一切都很好,而且一切都很好。但是,我的要求是MyUpwardBase必须被继承(用一些抽象成员声明为abstract)。我可以进入代码隐藏并在基类上设置abstract修饰符。即便如此,我也可以设计MyReportsBase。但是,此时,我从MyReportsBase继承的所有报告都不再可设计。尝试在设计器中打开派生报表会引发设计器无法打开基类的错误,因为它被声明为抽象。

所有这一切都只是为了澄清这个问题。现在,界面建议对我来说是最有意义的。

编辑2
出于这个原因,接口并没有真正为我做这件事。基类“abtract-but-not-abstract”成员必须存在于我的基类中,因为我有依赖它们的虚拟和公共成员。在我的情况下,因为我不能将该类声明为抽象,所以我必须为这些成员实现。

只要我为这些成员提供实现,那么我的所有继承类也都有实现,并且接口在编译时不会抱怨。我想通过从编译器需要它们的那些成员中删除虚拟修饰符但是它没有那样做。

我开始认为我的解决方案(记录好成员)是最好的解决方案。

2 个答案:

答案 0 :(得分:0)

为什么抽象类的基类也有一个基类不可设计?

public class Base
{
    public int SomeInt { get; set; }
}

public abstract class BaseChild : Base
{
    public abstract string Value { get; set; }
}

public class ChildChild : BaseChild
{
    public override string Value { get; set; }
}

作品。还是我误解了?

var child = new ChildChild { SomeInt = 3, Value = "asd" };

答案 1 :(得分:0)

你不想使用interface

class A: ActiveReport
{
    // some public methods to share between all childs
}

interface IReport
{
    // some required method
}

Class B: A, IReport
{
} 

Class C: A, IReport
{
}
.
.
.