C# 声明抽象类类型的变量

C# 声明抽象类类型的变量,c#,abstract-class,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; }

我有一个抽象基类,其中包含一些受保护的成员,但没有抽象成员:

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

接口不是选项,因为我希望它是内部的,而不是公共的,
我不希望基类被实例化,所以我认为抽象在这里是一个不错的选择。

您可能想使用抽象方法:

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

}

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

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

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

要使用特定的类方法,需要强制转换对象,因此:

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();
}
// ...

也考虑过这个,但是每个子级的名称和方法的数量都不同,因此将它们抽象化不是一个选项。@Koen这不是一个好主意,因为如果每个子级的名称不同,则需要一组
if
来尝试转换所有这些类型,以决定调用什么。为什么名字这么重要?因为它有不同的功能。相同的成员是基类中受保护的成员。儿童班的其他人可以是任何人。我只是想在“MyClass”中加入一些结构,以强制我在那里使用的类应该实现基类。您的代码不会按原样工作,您必须在子类中标记要重写的虚函数,并且在子类中定义函数时需要使用“override”关键字class@MSUH我知道,但问题是我不想覆盖任何方法。我已经将每个类的memthods作为受保护方法放在基类中。在儿童课上,我可以放任何我喜欢的东西。我只是想确保我在“MyClass”中实例化的类实现了“BaseClass”。然后你需要检查(child1是BaseClass){child1.domeThingSpecificForChild1(1);}恐怕你是对的。也许我必须寻找一个不同的设置,因为这并不是我想要的。。。无论如何,谢谢你。