C ++ /任何OOP语言:在没有类声明的情况下向现有类添加方法

时间:2017-01-06 23:25:11

标签: oop

(我找到了这个问题的部分答案here,但问题仍然存在)

在C ++中你有这个讨厌的'特性',尽管在类定义之外定义了函数,你仍然必须在类中声明它。它有它的优点,但仍然非常烦人,因为除了透明代码之外我还想拥有很多辅助功能,而不需要在最终的API中显示它们。

我理解面向对象的C ++的设计不允许它(可能有一些疯狂的指针到函数的方式,如果你知道的话,我也想知道它:D),但我很感兴趣是否有任何流行的编程语言能够在类体外声明/定义函数。当然我知道其他方式(只保持每个变量公开),但它不允许我们在不更改只读标头的情况下对现有API进行操作。

问题示例(来自虚幻引擎):

FVector a(1,2,3), b(3,4,5);
float c1 = FVector::DotProduct(a,b);
//but...
float c2 = a.Dot(b); 
//method doesn't exist. I have to make new child class inheriting from FVector 
//to actually be able to use simple .Dot method

2 个答案:

答案 0 :(得分:1)

在C#中,一个类可以跨越多个文件。此功能称为部分类。您可以使用部分类来:

  • 使用多个开发人员在同一个班级工作,而无需一直合并类文件
  • 您可以将其他代码添加到您可能希望稍后重新生成的自动生成的类

示例(摘自MSDN)

public partial class Employee
{
    public void DoWork()
    {
    }
}

public partial class Employee
{
    public void GoToLunch()
    {
    }
}

需要使用partial关键字标记类的所有部分。这意味着您只能扩展其作者要扩展的类。这可以确保原始开发人员能够控制他的课程(例如抽象,密封......)

答案 1 :(得分:1)

据我所知,你可以在C#(部分类),Objective-C(扩展+类别),Swift(扩展)中做到这一点。 你也可以在C ++中做一些变通方法,你可以定义辅助类,它将包含你不希望在公共API中显示的所有函数(如果需要,不要忘记把它变成朋友类)在公共类中存储指向此类实例的指针。使用这种方法,您甚至没有义务将带有辅助类接口的头包含在您的公共类头中(前向声明就足够了)并且可以在某处隐藏它。您只需要在实现文件中使用该标头。