声明抽象类类型的变量

时间:2012-06-21 09:30:38

标签: c# abstract-class

我有一个带有一些受保护成员的抽象基类,但没有抽象成员:

internal abstract class BaseClass
{

    protected readonly string Var1;
    protected readonly string Var2;

    protected BaseClass(string var1, string var2)
    {
        Var1 = var1;
        Var2 = var2;
    }

    protected int DoSomething1(string s)
    {
    }
}

有些类实现了这个基类,并且每个类都有一些不同的特定方法:

internal sealed class Child1:BaseClass
{
    internal Child1(string var1, string var2)
        : base(var1, var2)
    {
    }

    internal bool DomeSomethingSpecificForChild1(int i)
    {
    }

}

现在我有另一个类,我希望有一个BaseClass类型的变量,并根据我的需要,用子类型实例化它。 但这不起作用,因为具体方法尚不清楚。

public class MyClass
{
        private BaseClass myBaseClass;

    public bool DomeSomethingSpecific(int i)
    {
            myBaseClass = new Child1("a","b");
            myBaseClass.DomeSomethingSpecificForChild1(i);
    }
}

有没有办法可以达到我想要的效果? 或者我必须在MyClass中的方法的内部范围内声明我的变量?

public class MyClass
{
        private BaseClass myBaseClass;

    public bool DomeSomethingSpecific(int i)
    {
            var child1 = new Child1("a","b");
            myBaseClass.DomeSomethingSpecificForChild1(i);
    }
}

但是这种方式我不确定该类是否实现了BaseClass

接口不是一个选项,因为我希望它保持内部,而不是公共, 而且我不希望实例化基类,所以我认为抽象将是一个不错的选择..

4 个答案:

答案 0 :(得分:0)

private BaseClass child;

public bool DomeSomethingSpecific(int i)
{
        var c = {initialization to an instance - e.g. Child1(), Child2(), Child3()..};
        if (c is Child1){
            ((Child1)c).DomeSomethingSpecificForChild1(i);
        }
}

答案 1 :(得分:0)

您可能想要使用抽象方法:

internal abstract class BaseClass
{

    protected readonly string Var1;
    protected readonly string Var2;

    protected BaseClass(string var1, string var2)
    {
        Var1 = var1;
        Var2 = var2;
    }

    protected int DoSomething1(string s)
    {
    }

    public abstract bool DoSomethingSpecific(int i);
}

然后

internal sealed class Child1:BaseClass
{
    internal Child1(string var1, string var2)
        : base(var1, var2)
    {
    }

    public override bool DomeSomethingSpecific(int i)
    {
    }

}

答案 2 :(得分:0)

将子类对象强制转换为基类

public class MyClass
{
    public bool DomeSomethingSpecific(int i)
    {
            var child1 = new Child1("a","b");
            ((myBaseClass)child1).DomeSomethingSpecificForChild1(i);
    }
}

答案 3 :(得分:0)

显然,您将变量声明为基类实例,您只能使用基类公开的方法。

要使用特定的类方法,您需要转换对象,所以:

if(child is Child1)
{
    Child1 c1 = child as Child1
    if(c1 != null) c1.specificMethod1();
}
if(child is Child2)
{
    Child2 c2 = child as Child2
    if(c2 != null) c2.specificMethod2();
}
// ...