0

我有一个抽象类 ClassA,其抽象方法采用 ClassB 类型的参数。几个类派生自它。现在我添加另一个项目,它具有类似的功能,但需要稍微不同的基类 A 来派生它的几个类。主要区别:新的基类 ClassC 不应将 ClassB 作为参数,而是另一个从 B 派生的 ClassD。然后 ClassC 应该再次被几个类用作基础。

这可能吗?这更多是出于好奇。我知道通过这样做可以使用泛型:

public abstract void Method1<T>(T parameter) where T : ClassB;
...
public override void Method1<ClassB>(ClassB parameter) {

没有泛型可以吗?除了必须键入两次之外,它们还有什么缺点吗?

abstract class ClassA
{
    public abstract void Method1(ClassB parameter);
}

class DerivingClasses1 : ClassA
{
    public override void Method1(ClassB parameter)
    {
        // do something
    }
}

// -------

abstract class ClassC : ClassA
{
    // This would have to override Method1 of ClassA somehow,
    // instead of overloading it.
    public abstract void Method1(ClassD parameter);
}

class DerivingClasses2 : ClassA
{
    public override void Method1(ClassD parameter)
    {
        // do something
    }
}

// -------

class ClassB
{
}

class ClassD : ClassB
{
}
4

3 回答 3

4

在我看来,最好的方法是使用密封的实现来覆盖基类方法,该实现使用新的参数类型调用重载,从而将用户与类型转换隔离开来。

abstract class ClassC : ClassA
{
    public override sealed void Method1(ClassB parameter)
    {
        this.Method1(parameter as ClassD);
    }

    public abstract void Method1(ClassD parameter);
}

编辑:如果在生产中使用,您应该执行正确的类型检查以避免出现意外的空值:

abstract class ClassC : ClassA
{
    public override sealed void Method1(ClassB parameter)
    {
        if (!(parameter is ClassD))
            throw new ArgumentException(
                "Parameter must be of type ClassD.", "parameter");

        this.Method1((ClassD)parameter);
    }

    public abstract void Method1(ClassD parameter);
}
于 2012-05-02T18:59:43.067 回答
0

用另一个具有不同参数的抽象方法覆盖

这实际上是不可能的,但是您可以使用通用接口:

interface IMyType {}

class MyTypeBase 
{
  public abstract void Method1(IMyType parameter); 
}
于 2012-05-02T18:57:26.427 回答
0

只需在 ClassC 中实现这两种方法。

于 2012-05-02T18:58:06.343 回答