代码之家  ›  专栏  ›  技术社区  ›  Aaron Fischer

从密封类继承

  •  1
  • Aaron Fischer  · 技术社区  · 15 年前

    假设我有一个我的类需要验证和跟踪的电话号码,并且电话号码在很大程度上只是一个字符串,所以在尝试干燥时,只需创建一个电话类并从字符串继承。既然我做不到,那么下一个最好的方法是什么?是否将字符串添加为私有成员并重载equal/=运算符,以便将其传递并设置为字符串?

    4 回复  |  直到 15 年前
        1
  •  7
  •   Johannes Rudolph    15 年前

    喜欢组合而不是继承。

    您希望您的电话号码可以从字符串中分配吗?当然不会,因为届时可能会出现以下情况:

    Person.PhoneNumber = "FOO"
    

    这种感觉更自然:

    Person.PhoneNumber = new PhoneNumber("015-123456");
    

    您可以在构造函数中进行自定义验证,并另外决定希望它是不可变的(好的,字符串也是不可变的)

        2
  •  2
  •   C. Ross trotttrotttrott    15 年前

    简言之,是的,有一个私人会员。但是,我建议使用静态解析成员,而不是重载赋值。

    PhoneNumber p = PhoneNumber.Parse("704 - 576- 4000");
    

    这更标准,也更具可读性。而且,即使您可以从string继承,我也建议不要这样做,因为string具有复杂的内部功能,应该与您的类分开。同样,从字符串继承会暴露许多对电话号码没有意义的方法(例如:Concat、不准确的比较等)。

        3
  •  1
  •   TLiebe    15 年前

    我将按照您的建议创建带有私有字符串成员的PhoneNumber类。如果您想提供一致的格式(例如(123)123-1234或其他),可以重写ToString()方法,您可以在set方法或构造函数上添加一些验证,以确保电话号码有10位数字(如果是北美号码)。

        4
  •  1
  •   Michiel Buddingh    15 年前

    我建议你接受约翰·鲁道夫或C·罗斯的建议。您还可以查看 implicit 关键字,它将允许您在进行验证时以类似字符串的方式进行分配。

    即。:

    public class PhoneNumber {
    
        private String number;
    
        public PhoneNumber(String s) {
             // validation code here, throw exception if not valid
             number = s;
        }
    
        public static implicit operator PhoneNumber(String s) {
             return new PhoneNumber(s);
        }
    }