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)
    {
    }
}

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

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

4 回答 4

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);
        }
}
于 2012-06-21T09:34:46.890 回答
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)
    {
    }

}
于 2012-06-21T09:36:19.213 回答
0

将子类对象转换为基类

public class MyClass
{
    public bool DomeSomethingSpecific(int i)
    {
            var child1 = new Child1("a","b");
            ((myBaseClass)child1).DomeSomethingSpecificForChild1(i);
    }
}
于 2012-06-21T09:37:48.277 回答
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();
}
// ...
于 2012-06-21T09:41:15.890 回答